我目前正在构建一个 Ruby on Rails 应用程序,它允许用户通过 Gmail 登录,并且它与他们的收件箱有一个持续的 IDLE 连接。电子邮件在进入他们的 Gmail 收件箱后需要立即到达应用程序。
目前我在实现方面有以下几点,还有一些问题我真的需要一些帮助来解决。
目前,当 Rails 应用程序启动时,它会为每个用户创建一个线程,该线程进行身份验证并在循环中运行以保持 IDLE 连接处于事件状态。
每隔 10-15 分钟,线程将“反弹 IDLE”,以便传输少量数据以确保 IDLE 连接保持事件状态。
我认为主要问题在于可扩展性和应用与 Postgres 的连接数量。似乎每个线程都需要连接到 Postgres,这在 Heroku 上将受到最大连接数的严重限制(基本为 20 个,之后的任何计划为 500 个)。
我真的需要以下方面的帮助:
- 让所有这些 IDLE 连接保持事件状态,同时减少数据库所需的线程和连接数量的最佳方法是什么?
- 注意:如果 Gmail 的刷新 token 用完,可能会发生用户 token 刷新,因此这需要访问数据库
- 对于如何实现,是否有任何其他建议?
编辑:
我在这个问题中实现了类似于 OP 的东西:Ruby IMAP IDLE concurrency - how to tackle?
最佳答案
无需为每个 IMAP session 生成一个新线程。这些可以在单个线程中完成。
维护所有用户及其 IMAP session 的数组(或哈希)。生成一个线程,在该线程中,一个接一个地向每个连接发送 IDLE keep-alive。定期运行循环。这肯定会给您带来比当前方法更多的并发性。
一个长期的方法是使用 EventMachine。这将允许在同一线程中使用多个 IMAP 连接。如果您在同一个进程中处理 Web 请求,您应该为 Event Machine 创建一个单独的线程。这种方法可以为您提供非凡的并发性。参见 https://github.com/ConradIrwin/em-imap用于 Eventmachine 兼容的 IMAP 库。
关于ruby-on-rails - 用于多个帐户的带有 IMAP IDLE 的 Ruby on Rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17673388/