懒惰的盗版模式与真实的请求数据

时间:2013-04-25 18:34:13

标签: python zeromq

我正在使用PyZMQ绑定学习zmq,我在使用Lazy Pirate模式时遇到了麻烦。 所以,这是Lazy Pirate serverLazy Pirate client的代码。

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

此外,我并不完全理解客户端代码中的sequence变量 - 它无限递增=>当sequence达到int variable max?时,python不会崩溃吗?

2 个答案:

答案 0 :(得分:3)

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

  1. 请求消息可以直接发送
  2. 请求消息发送,但客户厌倦了等待并在响应返回之前超时
  3. 在第二种情况下,如果您没有sequence号码,则不知道您的哪个请求实际上是成功的请求。

    考虑此客户历史记录:

    • 发送请求#1
    • 超时
    • 发送请求#2
    • 超时
    • 发送请求#3
    • 收到回复

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

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

    要发送超过序列号的信息,请使用序列化格式并发送整个对象。

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

    无限递增的sequence变量可以用int64替换然后就可以了,或者你可以做一些像使用GUID作为标识的请求。

答案 1 :(得分:1)

不幸的是,Timothy Shields的回答是100%不正确。您可以在此free for download version of his book 代码连接第1卷中阅读Hintjen的评论。重要的一点来自第141页,如下所示......

  

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

有关裸TCP可能失败的方式的有趣讨论,这是a good discussion。阅读评论。我毫不怀疑蒂姆是非常知识渊博的,他只是因为没有认识到特别是 ONLY 的懒人海盗模式使用REQ-REP而陷入困境,因此比他的评论所暗示的更可靠。