2017-02-25 28 views
0

我想要设计一个应用程序,其中后端持续轮询不同的传感器,而前端(sinatra)允许通过json api查看此数据,或者通过简单显示在html中的结果。如何允许sinatra智能轮询数据

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

我的第一个想法是简单地让sinatra在每次接收到正确的端点请求时都对传感器进行轮询,但是这看起来好像会让安静得很快,特别是看到某些传感器每隔几秒钟才更新一次。

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

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


适当注意,这个应用程序也将负责不同的继电器自动化和基于这样的关闭传感器和西纳特拉仅用于中继传感器的状态向用户负责。我认为将后台进程/后台进程中的后端(自动化+传感器信息)与前端(sinatra)分开将是理想的,但我不确定我将如何获取sinatra的数据。


任何人都有关于如何构造这个结构的任何输入?如果可能的话,我也会欣赏一个示例应用程序,它只是显示我可以采用和修改的想法。

感谢

编辑::

后多一点研究,我发现drb(分布式红宝石http://ruby-doc.org/stdlib-1.9.3/libdoc/drb/rdoc/DRb.html),它使您可以在网络上对象的远程调用。这可能是一个合适的解决方案,因为守护进程可以自动执行继电器,读取传感器并将值存储在类对象中,然后通过drb呈现类对象,以便sinatra可以调用远程对象上的getters以获取从守护进程到日期数据。这是我最初想要做的。

你们认为什么?这对这样的应用程序是可取的吗?

+0

你应该使用WebSockets进行双向通信。它将消除完全轮询的必要性。我建议[faye-websocket](https://github.com/faye/faye-websocket-ruby) –

+0

@maxple我找到了'DRB'并编辑了我的问题的一部分。你认为DRB适合与sinatra一起使用吗?理想情况下,我正在寻找一种方式从远程过程中轻松获取数据,以便在另一个进程中运行的sinatra可以将数据呈现给客户端。 –

+0

我不知道DRB,所以我不知道。但是,您也可以使用服务器<=>服务器通信的websockets(如果您可以在传感器机器上运行webapp) –

回答

0

我决定与Sinatra,DRB和Daemons一起去满足我上面提到的要求。

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

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

最后,后端和前端将使用守护程序包装程序打包,以便该项目具有启动,重新启动,停止,运行状态和自动重新启动守护进程的功能,如果它崩溃或退出原因。

来源的信息:

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