ruby-on-rails - 用于多个帐户的带有 IMAP IDLE 的 Ruby on Rails

标签 ruby-on-rails ruby imap

我目前正在构建一个 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/

相关文章:

ruby-on-rails - 在 Ruby 中搜索数组的更好方法?

mysql - 如何使用 Tire 从 Elasticsearch 索引中获取数据而不访问数据库

Ruby Gem 包管理器因 Gem::GemNotFoundException 失败

java - 无法在 Android 上使用 XOAUTH 连接到 Gmail IMAP

java - 安卓 : Connection refused at POP3Store

javascript - jQuery UI Dialog 而不是 Rails 3 数据确认属性的 alert()

ruby-on-rails - 如何在初始构建失败后在 CodeClimate 上开始另一个构建?

ruby-on-rails - RSpec 对页面上的元素抛出误报

ruby - StringIO 实例改变原始字符串

c# - 如何获取指定的消息标签?