网络编程抽象,分解

时间:2009-10-01 18:45:27

标签: python networking network-programming twisted

我遇到如下问题:

服务器进程1

  • 不断发送数据存储区发生的更新

服务器进程2

  • 客户端联系查询数据存储区的服务器,并返回结果

问题是,流程1和流程2发送回客户端的结果完全不同且无关。

如何解析这个? 您是否只有一个进程不断发送数据,并将协议定义为具有与返回类型是1还是2相对应的位?

你有两个程序吗?那么他们如何共享数据存储(它只是一个结构而不是数据库)?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您可以将自己限制为Twisted,我建议您使用Perspective Broker。它本质上是一个RPC系统,并不关心“客户端”和“服务器”的概念 - TCP连接的发起者或响应者可以在PB中启动RPC调用。

因此,服务器1将接受带有回调对象的注册调用,并在有新数据可用时调用回调。服务器2在客户端需要时提供各种RPC操作。如果他们使用相同的数据,我会将两台服务器放在一个进程中。

答案 1 :(得分:1)

听起来您希望“在某处”流式传输一系列整数,并将它们收集在数据存储区中。在我的系统中,我将传感器读数传输到数据库中,并允许它们直接转到Web客户端,为它们提供实时功率读数。我写了一篇关于database is not suitable for live data原因的博客文章 - 虽然它非常适合保存数据以供日后分析。

我的第一个服务器进程是一个扭曲的服务器,它使用txamp将整数流传输到RabbitMQ。任何想要实时数据的客户端都可以使用Txamp在RabbitMQ中订阅流。 Web浏览器客户端可以使用Orbited here is a worked example

在您的设计服务器1中保存到数据库。您可以让server3从RabbitMQ收集数据并将其传输到数据库。我计划有一台服务器收集数据块并渲染图形以存储到中央文件共享。

不要创建自己的消息传递系统,RabbitMQ经过了充分测试,可扩展,并且可以在出现问题时保留您的“消息”(原始数据)。

答案 2 :(得分:0)

为什么不使用数据库而不是“只是一个结构”?关系数据库和非关系数据库都提供了许多实际优势(使用它们的单独进程,负责复制[[和/或快照,备份,...]],如果您需要“查询”,则可以使用丰富的功能,等等等等)。

最糟糕的情况是,“只是一个结构”可以由完全专用于它的第三个进程处理(基本上模仿任何数据库引擎所能提供的 - 尽管引擎可能会做得更好更快;-),允许你至少要保持良好的分解(两个服务器进程都与“数据存储进程”交互)。