使用ActiveRecord将记录存储在数据库中的长期运行的ruby进程
我正在尝试使用Ruby on Rails编写应用程序,并且正在尝试实现以下目标:
The app needs to receive UDP messages coming in on a specific port (possibly 1 or more per second) and store them in the database so that the rest of my Rails app can access it.
我当时正在考虑编写一个单独的守护程序,该守护程序将接收这些消息并将其封装到我的rails应用程序上的ruby脚本中,该脚本将使用正确的模型将消息存储在数据库中。这种方法的问题在于,ruby脚本将非常频繁地运行。如果我可以运行一个长期运行的ruby进程来不断接收UDP消息,并将其存储在数据库中,那将是更好的性能选择。
这是正确的方法吗? Rails框架中是否可以提供帮助?
解决方案
我们绝对不想为每个传入的请求加载Rails堆栈-这太慢了;我们将需要使用较低级别的内容来处理传入的连接。我们可能会查看Webrick的内部结构,以查看用ruby编码的简单服务器守护程序-或者,如果我们希望获得更高的性能,请查看Mongrel或者Thin。
总的来说,整个Rails堆栈在这里并不能为我们带来很多帮助-大部分都旨在为Web应用程序提供服务,而不是直接节省大量资源。
Rails可能对我们最有帮助的部分是ActiveRecord-我们很有可能要使用它来将Model数据存储在数据库中。实际上,我们应该能够"包含"实际的Rails模型,并在UDP监视过程中使用它们。查看ActiveRecord文档,以获取连接到Rails项目外部的数据库的示例。
我有一个执行类似操作的应用程序,即在端口上接收大量消息并将其持久化到数据库中。在改进数据库设计时,我们解决了许多问题,包括即使由于某种原因数据库不可用,我们也不能丢失消息的事实。
出于性能原因并确保我们不会丢失消息,我们进行了两个阶段的流程。我们编写了一个小的处理程序,侦听消息,然后使用Apache Active-MQ将其持久化到消息队列中。然后,我们在单独的Rails应用程序中使用ActiveMessaging插件来消耗队列中的消息并将其持久化到数据库中。这种方法使扩展侦听器变得容易,并且将导致更高的消息传递吞吐量。
如果我们打算走这条路,那么我们可能需要查看Active-MQ的Fuse实现,该实现通常是Apache版本的进一步版本。