草庐IT

amazon-web-services - 位于不同区域的 EC2 实例之间的数据实时复制

coder 2023-11-08 原文

我是 AWS 和后端架构的新手。我当前的配置是一个 EC2 实例(新加坡东南地区),它运行一个用于实时聊天应用程序的 Twisted 实时服务器。

目前,在我的实现中,每当发送者向服务器发送消息时,如果接收者不在线,它就会存储在服务器上的 python 字典中。所以基本上它是将此消息存储在实例的 RAM 中。现在,我想让该应用程序在全局范围内可用,因此我将在不同区域的实例上运行它。所以我的问题是,我应该如何将存储在一个实例的 RAM 中的字典复制/复制到所有其他实例,以便它在所有区域都可用? (将消息存储在 RAM 而不是数据库中的原因是应用程序的性质。该应用程序涉及大量突发发送的消息,这要求它比持久性数据库存储的 I/O 读写。)我的目标是使该应用程序在全局范围内可用,并具有实时性能。

(请不要将此问题标记为“基于意见”的问题并关闭它。我是服务器端架构的新手,我真的需要有人至少为我指明正确的方向。而且我不我想我可以在 StackOverflow 以外的任何地方找到这方面的帮助。)

最佳答案

如果我必须自己构建它,我会想到以下几点(我已经在我们自己的项目中实现了大部分这些指针,这花了我很长时间)。

  • 如果您真的需要所有服务器同步,您将需要 consensus protocol .如果你这样做。不要自己 build 这个。这将花费大量时间和错误。
  • 如果可以,将您的聊天数据划分到聊天室中,并且只有几台服务器处理一个聊天室。
  • 我使用 msgpack 对我的数据进行编码。它比 json 更快更小。
  • 在通过网络发送数据之前,压缩数据对您大有裨益。看看 zlib 或 lz4 之类的东西
  • 即使压缩后的 msgpack 的大小与压缩后的 json 几乎相同。我会选择 msgpack 因为它更快。它更容易解析,因为它是长度前缀编码的。
  • 我会尝试一起发送消息。每 x 毫秒对所有消息进行一次批处理。在我的项目中,我选择了 100 毫秒的消息批处理将为您节省大量带宽,因为您的压缩算法可以消除更多重复。
  • 您必须处理连接超时。仅当您收到回复时才将消息视为已发送已完成(您必须设计/选择您的协议(protocol)来处理该消息)
  • 想想什么是可以接受的,当出现崩溃或其他故障时您愿意丢失多少数据。如果您不愿意丢失数据,则必须实现将数据存储到磁盘的方法。
  • 我遇到过写入我们使用的数据库 (Google Cloud Datastore) 也需要很长时间的问题。大约在 100 毫秒到 900 毫秒之间,具体取决于我存储了多少。我所做的只是每隔 x 秒存储一次这些数据,并在下次运行时需要保存的对象上设置标志。当然,只有当您愿意在程序崩溃时丢失一些数据时,您才能这样做。
  • 您需要一些东西来跟踪哪些服务器正在运行以及哪个服务器负责哪些数据
  • 设置一些东西来检查您的连接是否有效。例如,每 x 次发送一次 echoRequests 和 echo。越早发现故障越好。但是请注意,如果您的 react 堆被某些 CPU 密集型任务阻塞,它不会及时发送您的回显。
  • 如果您无法控制传入的数据量,您将不得不减慢或惩罚连接,否则会占用您所有的服务器时间。

编辑:我现在才看到您正在研究 Redis。据我所知,这是一个很好的排队系统。如果可以,请使用它。实现上述内容需要花费大量时间才能正确完成。

关于amazon-web-services - 位于不同区域的 EC2 实例之间的数据实时复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30361608/

有关amazon-web-services - 位于不同区域的 EC2 实例之间的数据实时复制的更多相关文章

  1. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  2. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  3. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  4. ruby-on-rails - 如何将大于 5GB 的文件上传到 Amazon S3? - 2

    我目前正在使用带有Carrierwavegem的Rails3.2将文件上传到AmazonS3。现在我需要能够处理用户提交的大于5GB的文件,同时仍然使用Carrierwavegem。Carrierwave或Fog是否有任何其他gem或分支可以处理5GB以上的文件上传到S3?编辑:我不想重写一个完整的Rails上传解决方案,所以像这样的链接没有帮助:https://gist.github.com/908875. 最佳答案 我想出了如何做到这一点,并且现在可以正常工作了。在正确的config/environment文件中,添加以下内容以

  5. ruby-on-rails - 将 Amazon Simple Notification service SNS 与 ruby​​ 结合使用 - 2

    很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭9年前。我需要从基于ruby​​的应用程序使用AmazonSimpleNotificationService,但不知道从哪里开始。您对从哪里开始有什么建议吗?

  6. ruby - 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作? - 2

    我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe

  7. ruby-on-rails - 如何用不同的用户运行nginx主进程 - 2

    A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(

  8. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  9. ruby - 从 sinatra 中的 before do block 返回不同的值 - 2

    有没有办法在sinatra的beforedoblock中停止执行并返回不同的值?beforedo#codeishere#Iwouldliketo'return"Message"'#Iwouldlike"/home"tonotgetcalled.end//restofthecodeget'/home'doend 最佳答案 beforedohalt401,{'Content-Type'=>'text/plain'},'Message!'end如果你愿意,你可以只指定状态,这里有状态、标题和正文的例子

  10. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

随机推荐