我们使用Unicorn运行16个RoR应用程序实例。我们正在实施自动报告,并通过电子邮件和/或ftp发送报告结果。报告可能需要几分钟才能生成,因此我们使用线程池。
由于我们有16个实例,因此我们不希望在数据库中有16个#xthreads连接。理想情况下,我们只有一次运行预定报告的实例。
我可以想到几种方法:
1)让16个实例中的一个以某种方式与其他实例区别开来,这是唯一可以运行报告的实例。我认为这需要使用unicorn api进行一些编码,或者我们可能使用一个锁文件或者有一个允许实例编号运行报告的数据库列。
此方法的缺点是实例将包含在unicorn负载平衡中,因此用户将在生成报告时位于实例上。但是,如果线程正常工作,那应该不是问题。
2)对运行报告的1个实例进行单独的独角兽部署,并且不包含在apache / unicorn连接中。没有人会通过ui与这个实例进行交互 - 它只是运行报告。
这种方法的缺点是我必须记住在部署时更新此实例,并且它是另一个监视问题的实例。
我更喜欢#1支持简单,但我也很喜欢#2。
有没有人有这方面的经验?
答案 0 :(得分:0)
我最初使用的是使用专用报表实例的方法,该实例在size = 1的线程池中运行报表(后来只是一个普通的单线程)。看起来它会工作但是当我把它置于负载测试时,我很快发现主线程和报告线程中的活动会阻塞或导致提取问题(比如返回nil而不是数组)
我做了一些研究,rails / activerecord 2(我们目前正在进行)并非线程安全。
所以现在我将尝试使用when gem在rake过程中运行报告。我有这个工作了一段时间,但决定反对它,因为我不想维护一个外部cron(即使它在应用程序中配置,这对git很好)。