0

我想设计一个应用程序,其中后端不断轮询不同的传感器,而前端(sinatra)允许通过 json api 或简单地在 html 中显示结果来查看这些数据。

在开发这样的应用程序时我应该考虑哪些因素,以及我应该如何构建应用程序以实现最佳扩展和易于维护。

我的第一个想法是让 sinatra 每次收到对正确端点的请求时都轮询传感器,但这似乎会很快陷入安静,尤其是看到某些传感器如何每隔几秒钟才更新一次。

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

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


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


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

谢谢

编辑::

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

你们有什么感想?对于这样的应用程序是否可取?

4

1 回答 1

0

我决定使用 Sinatra、DRB 和 Daemons 来满足我上面提到的要求。

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

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

最后,后端和前端将使用 Daemons 包装器进行包装,以便项目具有启动、重新启动、停止、运行状态以及在因任何原因崩溃或退出时自动重新启动 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

于 2017-02-26T20:52:39.853 回答