设计持久异步 TCP 协议

设计持久异步 TCP 协议

我收集了一些网站,它们需要向我所在城市的所有主机发送时间敏感的消息,每个主机都有自己的动态 IP。到目前为止,我一直以脚本小子的方式执行此操作:

  1. 每台主机都运行一个(s)FTP服务器,或者一个HTTP(s)服务器,并且相应地其网关开放了某个端口。

  2. 每台主机都运行一个程序来监视某个文件夹,并在出现具有给定扩展名的新文件时自动打开、打印或执行 exec()。使用动态 DNS 服务来适应动态 IP 地址。

  3. 每个网站都会执行 cURL 或 fsockopen 或其他任何操作,并根据需要直接与其接收者进行通信。


这种方法非常可靠,但是也出现了一些明显的问题,需要加以解决。

如上所述,这些消息具有时效性,需要在最终用户提交后几分钟内检测到故障。我正在做的是构建一个消息传递协议。它将在我控制的机器和连接上运行。就服务而言,网站和主机之间没有区别——只有一个设备向另一个设备发送消息。

这就是我现在的情况。我有一个骨架服务器和一个骨架客户端。它们可以协商高质量的身份验证和加密。(TCP)连接是持久且异步的,并且可以处理分隔符(即,读至\r\n或其他)以及长度前缀(即,准确读取n字节)消息。除非有人给我更好的主意,否则我认为我会将消息作为字节数组来处理。


因此,我正在寻找有关如何在应用程序级别对协议本身进行建模的建议。我将主要传输 XML 和 DLM 类型的文件,以及诸如“握手”和“某某是否在线?”之类的控制消息。我的思路中有什么非常愚蠢的东西吗?或者在开始之前我应该​​阅读什么?诸如此类的东西——请,谢谢。


更新:

@mrdenny 的方法是我最终采用的方法,所以他知道答案。@Henrik 的 ZeroMQ 建议也适用,但我基本上已经编写了代码,将我的代码切换到第三方框架并没有真正帮助设计应用程序层。最后,我发现 HTTP 是多么的多功能,而且真的不需要自己动手的协议。只需让网站除了已经在做的 text/html 之外,还呈现内容类型 application/json(或 xml,如果需要),并让收件人发出出站 Web 请求,而不是监听和响应文件系统更新。消除了上面描述的所有“脚本小子”开销,工作更可靠,能够更好地处理错误,易于构建等等。

答案1

有什么原因导致您不能仅使用 Web 方法和 HTTP(或 HTTPS)调用在机器之间传输数据?

答案2

零MQ被设计为异步传输/消息协议。

如果您的某个节点发生故障,它将重新建立 ZMQ-Socket 并在目标端点的路由恢复时继续发送消息。性能良好,并且根据其 IRC 频道,它现已经过充分测试,可用于 WAN。

答案3

查看 FIX(如 FIX 协议)以了解此类协议的示例。您可以只使用 FIX 和开源库并自行定义所有字段。FIX 用于金融交易。

但它应该能给你一个不错的想法。如果需要,FIX 还可以/确实处理诸如在连接中断时持久消息之类的项目。

相关内容