如何允许 sinatra 巧妙地轮询数据

How to allow sinatra poll for data smartly

我想设计一个应用程序,其中后端不断轮询不同的传感器,而前端 (sinatra) 允许通过 json api 或通过仅在 html.

中显示结果

开发此类应用程序时应考虑哪些因素以及应如何构建应用程序以实现最佳扩展性和易维护性。

我的第一个想法是让 sinatra 每次收到到正确端点的请求时简单地轮询传感器,但这似乎会很快陷入安静的泥潭,尤其是看到一些传感器每隔几秒才更新一次.

我的第二个想法是让后台进程(或线程)轮询传感器并存储 sinatra 的值。当收到请求时,sinatra 可以简单地轮询后台进程以获取缓存值(或从线程代码中提取它)并将其呈现给客户端。

我更喜欢第二个想法,但我不确定我将如何开发 "background application" 以便 sinatra 可以轮询它以获取数据以呈现给客户端。另一种选择是让 sinatra 将传感器轮询代码线程化,这样它就可以在同一进程内简单地从中获取值,而不是从另一个进程请求它。


请注意,此应用程序还将负责不同继电器的自动化以及基于传感器的此类继电器,而 sinatra 仅负责将传感器的状态中继给用户。我认为将后台 process/daemon 中的后端(自动化 + 传感器信息)与前端 (sinatra) 分开是理想的,但我不确定如何获取 sinatra 的数据。


有人对我如何构建这个有任何意见吗?如果可能的话,我也希望能有一个示例应用程序,它简单地展示了我可以采纳和修改的想法。

谢谢

编辑::

经过更多研究后,我发现 drb(分布式 ruby http://ruby-doc.org/stdlib-1.9.3/libdoc/drb/rdoc/DRb.html)允许您通过网络对对象进行远程调用。这可能是这个问题的合适解决方案,因为守护进程可以自动化中继,读取传感器并将值存储在 class 对象中,然后通过 drb 呈现 class 对象,以便 sinatra 可以调用远程对象上的 getters 以从守护程序获取最新数据。这是我最初想尝试做的。

大家怎么看?对于这样的应用程序,这是可取的吗?

我决定使用 Sinatra、DRB 和 Daemons 来满足上述要求。

Web 前端将 运行 在其自己的进程中,并且仅通过与后端的 DRB 交互提供统计信息。这将使客户能够快速响应,并允许我将前端代码与后端代码分开。

后端将 运行 在其自己的进程中不断轮询传感器以获取更新并将它们存储为 class 带有 getter 的对象,以便 Sinatra 可以在需要时通过 DRB 获取信息。它还会将收集到的信息用于特定于项目的自动化。

最后后端和前端将被一个Daemons wrapper 包裹,这样项目将具有启动、重新启动、停止、运行 状态以及在崩溃或退出时自动重新启动Daemons 的功能无论出于何种原因。

来源信息:

http://phrogz.net/drb-server-for-long-running-web-processes

http://ruby-doc.org/stdlib-1.9.3/libdoc/drb/rdoc/DRb.html

http://www.sinatrarb.com/

https://github.com/thuehlinger/daemons