gpt4 book ai didi

mysql - EventMachine 和 MySQL 的架构建议

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:09 25 4
gpt4 key购买 nike

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

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

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

我们有哪些选择?我可以使用 EM.Defer 但我不知道可以处理多少并发玩家,因为线程池限制为 20。

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

有什么建议吗?

最佳答案

  1. 可以调整线程池大小 - 请参阅 EventMachine.threadpool_size
  2. 每个服务器进程(apache...)都会产生自己的 EventMachine react 器和自己的 EM.defer 线程池,所以如果您使用 fork 服务器(杂种服务器、passenger ... ) 你不需要为线程池的大小而疯狂
  3. 请参阅 Ilja Grigorik 的 EM-Synchrony (https://github.com/igrigorik/em-synchrony) - 您应该能够使用它简化您的代码
  4. Afaik,mysql 有一个非阻塞驱动程序,您可以自由地与 EM 一起使用,EM::Synchrony 支持它 http://www.igvita.com/2010/04/15/non-blocking-activerecord-rails/ - 这意味着您根本不需要 EM.defer!
  5. 看看 Thin - https://github.com/macournoyer/thin/ - 它是支持 Rails 的基于 EM 的非阻塞网络服务器

说了这么多,写事件代码是个婊子 - 忘掉堆栈跟踪并确保你经常运行基准测试,因为任何阻塞你的 react 堆的东西都会阻塞整个应用程序。

此外,这仅适用于 MRI Ruby。如果你打算使用 jruby ...你一定会遇到麻烦,因为 eventmachine 的线程安全似乎主要是由于 MRI Ruby 的 GIL 和标准模式不起作用(它的许多方面都可以工作使用这个 fork https://github.com/WebtehHR/eventmachine/tree/v1.0.3_w_fix 修复了 EM 与 JRuby 的一些问题)

不幸的是,来自 https://github.com/eventmachine/eventmachine 的家伙们有点不太活跃,该项目目前有 200 多个问题和近 60 个开放的拉取请求,这就是为什么我不得不使用单独的分支来继续玩我当前的项目——这仍然意味着 EM 是一个很棒的项目,只是不要不要期望您遇到的问题能够快速解决,因此请尽量不要走出 EM 使用的老路。

JRuby 的另一个问题是 EM::Synchrony 强加了严重的性能损失,因为 JRuby 没有从 1.7.8 开始实现纤程,而是将它们映射到慢得多的 Java native 线程


此外,您是否考虑过使用 RabbitMQ(它具有同步 https://github.com/ruby-amqp/bunny 和事件驱动程序 https://github.com/ruby-amqp/amqp)之类的消息传递作为在客户端之间传递游戏对象的可能性,并可能减少数据库/分布式内存存储的开销你想到了什么?

Redis/Resque 看起来不错,但是如果所有的工作都需要做的只是简单的持久化,并且如果会有很多这样的调用,您可能需要考虑 beanstalkd - 它比 Resque 有更快但更简单的队列如果您真的不需要 activerecord 将属性散列转储到数据库中,您可以使它更快,请参阅 delayed_jobs vs resque vs beanstalkd?

关于mysql - EventMachine 和 MySQL 的架构建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20259760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com