4

我正在使用 PyZMQ 绑定学习 zmq,但我在使用 Lazy Pirate 模式时遇到了麻烦。因此,这里是Lazy Pirate 服务器Lazy Pirate 客户端的代码。

在示例客户端发送请求,但它是简单的数字。如何使用文本数据提出真正的请求并保持模式实现?

另外,我并不真正理解客户端代码中的变量-它无限增加=>当达到int变量最大值sequence时python不会崩溃吗?sequence

4

2 回答 2

3

首先,sequence代码中的变量基本上是一个消息标识符。单个请求尝试失败的方式有两种:

  1. 请求消息永远不能发送
  2. 请求消息发送,但客户端厌倦了等待并在响应返回之前超时

在第二种情况下,如果您没有sequence编号,您不知道您的哪个请求实际上是成功的请求。

考虑这个客户历史:

  • 发送请求#1
  • 暂停
  • 发送请求#2
  • 暂停
  • 发送请求#3
  • 收到回复

哪个请求触发了响应?由于上面提到的第二种请求失败,它可能是三个请求中的任何一个。通过sequence响应中的数字,我们可以准确地知道哪个请求是服务器处理的请求。

示例客户端中“来自服务器的格式错误的回复”背后的想法是,如果客户端正在处理请求 #3(请求 #1 和 #2 已超时),它会丢弃响应 #n(其中 n < 3)直到它收到它接受的响应 #3。

要发送多个序列号,请使用序列化格式并发送整个对象。

例如,我可以定义class MyRequest { int sequence; string text; }然后将其作为 JSON 发送到服务器。

可以用 int64 替换无限递增的sequence变量,然后就可以了,或者您可以执行类似使用 GUID 作为标识的请求的操作。

于 2013-04-26T23:41:07.150 回答
1

不幸的是,Timothy Shields 上面的回答是 100% 不正确的。您可以在他的书Code Connected Volume 1的免费下载版本中 阅读 Hintjen 的评论。重要的一点来自第 141 页,如下...

客户端对每条消息进行排序,并检查回复是否完全按顺序返回:没有请求或回复丢失,没有回复多次返回或乱序返回。运行测试几次,直到您确信这种机制确实有效。在生产应用程序中不需要序列号;他们只是帮助我们信任我们的设计。

对于裸 TCP 可能失败的方式的有趣讨论,这是一个很好的讨论。阅读评论。我毫不怀疑蒂姆知识渊博,他只是因为没有认识到懒惰海盗模式特别使用 REQ-REP 而犯了错误,因此比他的评论所暗示的更可靠。

于 2014-01-06T23:23:55.827 回答