Python 当订阅服务器断开连接时,如何从发布服务器恢复丢弃的邮件?

Python 当订阅服务器断开连接时,如何从发布服务器恢复丢弃的邮件?,python,zeromq,publish-subscribe,pyzmq,Python,Zeromq,Publish Subscribe,Pyzmq,有: 绑定到localhost:5556并每2秒发送一次消息(topic1、topic2)的发布者 连接到localhost:5556并分别接收“topic1”和“topic2”的两个订阅服务器 当PUB发送消息并且订阅者收到消息时,所有这些都可以正常工作 我的问题是当两个订户中的一个停止工作时。我希望PUB丢弃的所有消息都将排队,并在“死亡”订阅者激活时发送给它。这不会发生。当订阅者重新连接到发布者时,在这段时间内发送的所有消息(从死消息到活消息)都将丢失 我正在尝试使用pyzmq模块在pyt

有:

  • 绑定到
    localhost:5556
    并每2秒发送一次消息(topic1、topic2)的发布者
  • 连接到
    localhost:5556
    并分别接收“topic1”和“topic2”的两个订阅服务器
  • PUB
    发送消息并且订阅者收到消息时,所有这些都可以正常工作

    我的问题是当两个订户中的一个停止工作时。我希望
    PUB
    丢弃的所有消息都将排队,并在“死亡”订阅者激活时发送给它。这不会发生。当订阅者重新连接到发布者时,在这段时间内发送的所有消息(从死消息到活消息)都将丢失

    我正在尝试使用
    pyzmq
    模块在python中编码

    此外,我注意到,如果要关闭python订户进程,请尝试添加
    time.sleep(10)
    PUB
    将消息排队,当订户醒来时,所有消息都会被发送。如果进程关闭(CTRL+C)并重新启动,则不会发生这种情况

    但是,如果我尝试将发布者和订阅者之间的
    bind()
    connect()
    倒置,那么应用程序就会按照我的要求工作。但在这种情况下,有一个大问题。我无法将更多订阅服务器关联到一个发布服务器,因为订阅服务器绑定到不同的端口,而发布服务器只能连接到一个端口

    我怎样才能解决它

    “我的问题是……”可以解决 ZeroMQ是一个智能、高性能的信令/消息传递框架,用于提供服务层,由可扩展的正式通信原型组成。多年来,这是为低延迟、高性能、几乎线性扩展和易于使用代理的分布式行为而优化的,这些行为类似于人类行为(如一个
    REQ
    -uests,另一个将
    REP
    -ly)

    通过设计,所有这些都是无代理的——也就是说,没有像“中间人”存储这样的东西,用于重新发送消息,在代理停止服务时,通过框架基础设施发送消息

    这并不意味着,如果确实需要这样一组属性,就不能在应用程序层上实现这样的功能。设计师的职责是定义要添加的所有功能(时间戳、消息存储、NACK/POSACK消息传递的索引计数器标志、用于请求丢失消息的专用双向协议等)

    因此,这一部分是可以解决的,但它既不消耗资源,也不增加基本框架的延迟,基本框架的设计具有最高的可实现性能和最低的可能延迟,使用Zen零(零拷贝,如有可能,零保修-要么提供原始信息的准确拷贝,要么什么都不提供,如果存在损坏的部件,等等)原则

    在较新的ZeroMQ版本中,甚至还有一个直接相反的特性,
    .setsockopt(ZMQ_CONFLATE,1)
    方法,它允许
    上下文
    实例数据管理器丢弃除最“新鲜”之外的所有数据来自各个交易对手的消息队列的消息,因此在下一次请求时传递,但传递的是最新的消息,而不是其他消息。这对于许多应用程序场景来说非常方便,“旧”消息如果不“立即”传递就会失去其价值而且,
    CONFLATE
    -模式允许不通过缓慢或不稳定的连接移动它们,因此(间接地)只对世界上“最新”状态的消息的分发进行优先级排序(丢弃过时的消息也会减少队列管理资源和工作负载,不是吗?)

    如果ZeroMQ概念对您的设计工作来说是新概念,请务必阅读Pieter HINTJENS的书,不仅仅是ZeroMQ框架本身的圣经,或者至少可以阅读第节中的ZeroMQ主要概念差异

    更糟的是,我注意到。。。 是的,这将很好地工作,因为两个分布式
    上下文
    -实例都使用单独的线程,这些线程保持联系,即使Python解释器被指示执行
    .sleep()
    (它执行此操作,但不执行连接维护协议特定数据泵两侧的信令工作)

    如果我尝试将
    .bind()
    .connect()
    哦,当然是这样的。想象一下BBC电台的一个例子——全世界所有的人都知道要收听的电台,而BBC电台的员工都不可能知道所有的电台听众,所以永远无法“建立”从BBC到全世界所有人的联系(正确的原因是他们每个人都有一个唯一的地址,这是广播公司事先不知道的,因此他们无法从其一侧设置相同的基础设施)。ZeroMQ
    PUB
    -lisher是同一类型的故事-你宣传“中央”要连接的地址和每个人,谁想要,谁可以,都会。反之亦然

    无论如何,在你未来的设计作品中享受ZeroMQ世界。它是值得掌握的

    “我的问题是……”可以解决 ZeroMQ是一个智能、高性能的信令/消息传递框架,用于提供服务层,由可扩展的正式通信原型组成。多年来,该框架针对低延迟、高性能、几乎线性扩展和易于使用的代理分布式行为进行了优化,这些行为类似于人类行为(就像一个
    REQ
    -uests一样,另一个将
    REP
    -ly)

    通过设计,所有这些都是无代理的——也就是说,没有像“中间人”存储这样的东西,用于重新发送消息,在代理停止服务时,通过框架基础设施发送消息

    这并不意味着,人们不能在手机上制作这样的功能