当前位置: 首页 > 知识库问答 >
问题:

EventMachine和MySQL的架构建议

邬博涉
2023-03-14

我们正在用EventMachine/Ruby编写一个实时游戏。我们使用ActiveRecord和MySQL存储游戏对象。

当我们启动服务器时,我们计划将所有游戏对象加载到内存中。这将允许我们使用ActiveRecord避免任何阻塞/慢速SQL查询。

当然,我们仍然需要在数据库中保存数据,以防服务器崩溃。

我们的选择是什么?我可以使用EM.Defer,但我不知道可以处理多少并发播放器,因为线程池限制为20个。

目前,我认为在Redis上使用Resque是最好的选择。对内存中的对象执行所有操作,并且每当需要对数据库进行保存时,启动一个作业并将其添加到Resque队列中。

有什么建议吗?

共有2个答案

吕森
2023-03-14

几年后,一个失败的项目,一些想法:

尽可能避免使用eventmachine,现在有很多机会将YARV/MRI Ruby与CPU绑定在IO受限的应用程序上,而不浪费内存。

目前我最喜欢的web应用程序方法是将Puma与多个进程和线程一起使用。

请记住,YARV中的GIL只影响Ruby解释器代码,而不影响IO操作,这意味着在IO受限的应用程序上,您可以添加线程,并看到单个核心的更好利用率,

添加更多的进程,你会看到许多核心的更好利用:)在Heroku 1x工作程序上,我们运行2个进程,每个进程有4个线程,这将我们的CPU潜力与基准测试中的顶部挂钩,这意味着应用程序不再受IO限制,而是受CPU限制,并且没有不可接受的内存损失。

当我们需要超快的响应时,DB写入操作时间并不影响对客户机的响应,因此我们使用sidekiq/resque进行异步数据库写入,

事后看来,你甚至可以为异步IO读/写(想想数据库写入、缓存访问等)做赛路洛或conext-ruby,它的开销和架构体系更少,但在生产中更难调试和解决问题——我最糟糕的噩梦是异步操作无声地失败,在我们的错误控制台中没有错误跟踪(例如异常处理中的异常

最终的结果是,您的应用程序体验到了与使用eventmachine(消除IO限制、充分利用CPU而不占用大量内存、并行非阻塞IO)相同的好处,而无需像我在2013年的帖子中所解释的那样编写反应器代码

洪弘壮
2023-03-14
  1. 线程池大小可以调整-请参阅EventMachine。线程池大小

话虽如此,编写事件代码是一件棘手的事情——忘记堆栈跟踪,确保经常运行基准测试,因为任何阻塞反应器的东西都会阻塞整个应用程序。

此外,这一切都适用于核磁共振Ruby ONLY。如果你想用jruby...你一定会遇到麻烦,因为事件机的线程安全似乎主要是由于核磁共振红宝石的GIL和标准模式不起作用(它的许多方面可以用这个分叉来工作https://github.com/WebtehHR/eventmachine/tree/v1.0.3_w_fix它修复了EM的一些问题JRuby)

不幸的是,来自https://github.com/eventmachine/eventmachine都不是很活跃,该项目目前有200个问题和近60个开放拉取请求,这就是为什么我不得不使用单独的fork来继续处理我当前的项目-这仍然意味着EM是一个很棒的项目,只是不要期望您遇到的问题会很快得到解决,所以请尽最大努力不要走出EM使用的老路。

JRuby的另一个问题是EM::Synchrony造成了严重的性能损失,因为JRuby从1.7开始还没有实现光纤。而是将它们映射到速度慢得多的Java本机线程

另外,您是否考虑过使用RabbitMQ(它有一个同步的https://github.com/ruby-amqp/bunny,以及参加比赛的司机https://github.com/ruby-amqp/amqp)作为在客户端之间通信游戏对象的一种可能性,也许可以减少您所考虑的数据库/分布式内存存储的开销?

ReDIS/RESK看起来不错,但是如果所有的工作都需要做的就是简单的持久性,如果有很多这样的调用,你可能会考虑BeaStald——它有很多更快但更简单的队列,然后RESQUE,如果你不需要ActureCordRD将属性哈希转入数据库,你可能会使它更快,看看延迟的工作、重新做工和豆茎?

 类似资料:
  • 本文向大家介绍MySQL 搭建MHA架构部署的步骤,包括了MySQL 搭建MHA架构部署的步骤的使用技巧和注意事项,需要的朋友参考一下 MAH 一:MAH架构介绍 MHA (Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本人youshimaton开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故

  • EventMachine 是一个基于 Reactor 设计模式的、用于网络编程和并发编程的框架。Reactor 模式描述了一种服务处理器,它接受事件并将其分发给已注册的事件处 理。这种模式的好处就是清晰的分离了时间分发和处理事件的应用程序逻辑,而不需引入多线程来把代码复杂化。 EventMachine提供了一个网络套接字和隐藏底层操作的高层接口。EventMachine: 拥有极高的可伸缩性、性能

  • 客户端-服务器(Client/Server)结构简称 C/S 结构,是一种网络架构,通常在该网络架构下的软件分为客户端和服务器。 服务器是整个应用系统资源的存储和管理中心,多个客户端分别各自处理相应的功能,共同实现完整的应用。在客户/服务器结构中,客户端用户的请求被传送到数据库服务器,数据库服务器进行处理后,将结果返回给用户,从而减少网络数据的传输量。 用户在使用应用程序时,首先启动客户端,然后通

  • 1)我应该能够通过addedtime进行范围查询,比如从x日期到y日期 2)我应该能够按appname查询,并使用addedtime按升序排列行 我怎样才能做到这一点?我可以更改表模式。 另外,我已经创建了两个DC和三个节点的Cassandra集群。

  • 我正在使用Kotlin,kapt和Android架构组件。当我构建项目时,一切似乎都很好,但在试图在设备/模拟器上运行应用程序后,Gradle的:Assemble任务抛出以下错误: 警告:警告:注释处理器“Android.arch.persistence.room.RoomProcessor”支持的源版本“release_7”小于-source“1.8” 更新 模块构建。在此处分级 项目生成。gr

  • 问题内容: 我已经来了一段时间,并阅读了许多有关该主题的网站。怀疑我有垃圾造成了这个问题。但是哪里? 当我在python中导入MySQLdb时,这是错误: 我正在尝试64位,所以在这里检查: 已将python的默认版本设置为2.6 尝试删除构建目录和python setup.py clean重命名为Python / 2.5 / site-packages,使其无法尝试提取它。 删除所有内容,并按照