一般来说,我对aws和后端架构还不熟悉。我目前的配置是一个ec2实例(新加坡东南部地区),运行一个实时聊天应用的twisted实时服务器。
目前,在我的实现中,每当发送者向服务器发送消息时,如果接收者不在线,它就会存储在服务器上的python字典中。所以基本上它是将这个消息存储在实例的ram中。现在,我想让这个应用程序在全球范围内可用,所以我将在不同地区的实例上运行它。所以我的问题是,我应该如何复制/复制这个存储在一个实例的ram中的字典到所有其他实例,以便它在所有区域都可以使用?(将消息存储在RAM而不是数据库中的原因是应用程序的性质。该应用程序包含大量突发发送的消息,这要求它比持久数据库商店的I/O读写提供的速度快得多。)我的目标是使该应用程序在全球范围内可用,并具有实时性能。
(请不要将此问题标记为“基于意见”的问题并关闭它。我是服务器端架构的新手,我真的需要有人至少给我指出正确的方向。我想除了StackOverflow,我在任何地方都找不到帮助。)

最佳答案

如果我必须自己构建它,我会想到一些事情(我已经在我们自己的项目中实现了大多数这些指针,我花了很长时间)。
如果你真的需要所有服务器同步,你需要一个consensus protocol。如果你愿意的话。别自己造这个。这需要很多时间和错误。
如果可以,请将聊天数据分区到聊天室,并且只有少数服务器处理一个聊天室。
我用msgpack来编码我的数据。它比json更快更小。
在通过网络发送数据之前,压缩数据会给您带来很多好处。看看zlib或lz4之类的东西
即使压缩的msgpack的大小与压缩的json几乎相同。我会选择msgpack,因为它更快。它更容易解析,因为它的长度前缀是编码的。
我会试着一起发信息。在我的项目中,我选择了100ms的批处理消息将节省大量的带宽,因为你的压缩算法可以消除更多的重复。
你必须处理连接超时。只有在收到回复时才将消息视为sentdone(您必须设计/选择协议来处理此问题)
想想什么是可以接受的,当某个东西崩溃或以其他方式失败时,你愿意丢失多少数据。如果你不愿意丢失数据,你就必须实现一些将数据存储到磁盘的东西。
我遇到的问题是,写入我们使用的数据库(google cloud datastore)也需要很长时间。比如100毫秒到900毫秒之间,这取决于我储存了多少。我所做的只是每x秒存储一次数据,并为下一次运行时需要保存的对象设置标志。当然,只有在程序崩溃时愿意丢失一些数据时,才能这样做。
您需要一些东西来跟踪哪些服务器正在运行,以及哪个服务器负责哪个数据段
设置一些检查您的连接是否处于活动状态的内容。例如,每X次发送一次echo请求和echo。你越早发现失败诱饵越好。但是请注意,如果您的反应器被某个CPU密集型任务阻塞,它将不会及时发送回显。
如果你无法控制输入的数据量,你将不得不减慢或惩罚连接速度,否则会占用你所有的服务器时间。
编辑:我现在才知道你在调查Redis。据我所知,这是一个很好的排队系统。如果可以的话就用这个。实现上述内容需要花费大量时间才能完成。

07-25 21:38
查看更多