gpt4 book ai didi

zeromq - 如果客户端断开连接,使用 ZeroMQ 向特定客户端和队列发送回复

转载 作者:行者123 更新时间:2023-12-04 21:11:37 26 4
gpt4 key购买 nike

我是 ZeroMQ 的新手并试图找出设计问题。我的情况是我有一个或多个客户端向单个服务器发送请求。服务器将处理请求,做一些事情,并向客户端发送回复。有两个条件:

  • 回复必须发送到发送请求的客户端。
  • 如果客户端断开连接,服务器应该将消息排队一段时间,以便客户端重新连接时,它可以接收错过的消息。

  • 我很难找出实现这一点的最简单方法。

    我尝试过的事情:
  • PUB/SUB - 我可以用主题标记回复,以确保只有发送他们的请求(以他们的主题作为他们的标识符)的订阅者才能收到正确的回复。这解决了路由问题,但由于发布者不知道订阅者,因此它对断开连接的客户端一无所知。
  • 推/拉 - 似乎能够处理消息队列问题,但看起来它不支持我将消息发送到特定客户端的计划(例如,基于他们的 ID)。
  • 路由器/经销商 - 设计似乎是两者的解决方案,但所有示例似乎都非常复杂。

  • 我现在的想法是继续PUB/SUB,尝试在客户端实现某种心跳(允许服务器检测客户端的存在),当客户端不再发送心跳时,它将停止发送标记为它的主题。但这似乎不是最理想的,并且还会涉及另一个套接字。

    对于我可能会实现的任何其他方式,是否有任何想法或建议?任何信息,将不胜感激。我正在使用 Python,但任何语言都可以。

    最佳答案

    要为您的解决方案准备最佳建议,请提供有关您的应用程序要求的更多数据。我对你的情况做了一些研究,并结合我对ZMQ的经验,在这里我提出两种可能性:

    1) 两个方向的推/拉模式 ,对可扩展性影响较大,但来自服务器的消息将被缓存。

    服务器有一个 PULL 套接字来注册每个客户端并从客户端获取所有消息。每条消息都应该有客户端 ID,以便服务器知道在哪里发送响应。

    为每个客户端 - 服务器创建 PUSH 套接字以发送响应。套接字配置在注册消息中发送。您还可以使用 REQ/REP 模式来注册客户端(分配套接字号)。

    每个客户都有自己的PULL套接字,该配置在注册消息中发送到服务器。

    这意味着需要三个客户端的服务器(例如 [] 中的端口号):

  • 服务器:1 x PULL[5555] socket ,3 x PUSH[5560,5561,5562]套接字(+ 可选 1 X REQ[5556] 用于注册的套接字,但我认为这取决于您如何准备客户端身份)
  • 客户:1 x PUSH[5555] socket ,1 x PULL[5560|5561|5562] (每个客户端一个)(+ 可选 1 X REP[5556])

  • 您必须将服务器连接到多个客户端套接字才能发送响应,但如果客户端断开连接,消息不会丢失。客户端在重新连接到他们的 PULL 套接字时将获得他们自己的消息。缺点是需要在服务器端创建少量 PUSH 套接字(客户端数量)。

    2) PUB/SUB + PUSH/PULL 或 REQ/REP , 服务器端的静态 cocket 配置(只有 2 个),但服务器必须准备一些机制来重新传输或缓存消息。

    服务器创建 PUB socket 和 PULLREQ .客户端通过 PULL 注册身份或 REQ socket 。服务器将使用此身份作为过滤器将所有消息发布到客户端。服务器使用 monitor()功能在 PUB用于计算连接和断开连接的客户端数量的套接字(操作:“接受”和“断开连接”)。 “断开连接”后, Action 服务器向所有客户端发布消息以再次注册。对于没有重新注册的客户端,服务器停止发布消息。

    客户端创建 SUB socket 和 PUSHREQ注册和发送请求。

    此解决方案可能需要服务器端的一些缓存。客户端可以在从 SUB 套接字获取每条消息后对其进行确认。它更复杂,必须与您的要求相关联。如果您只是想知道客户端丢失了消息。客户端可以发送注册期间从服务器收到的最后一条消息的时间戳。如果您需要保证客户端获取所有消息,则需要一些缓存实现。也许其他进程订阅所有消息并删除客户端确认的每个消息。

    在此解决方案服务器中,需要三个客户端([] 中的示例端口号):
  • 服务器:1 x PUB[5555] socket ,1 x REPPULL[5560] socket +监控PUB socket
  • 客户:1 x SUB[5555]过滤器的套接字和自己的身份,1 x REQPUSH[5560] socket

  • 关于监控,您可以在这里阅读: https://github.com/JustinTulloss/zeromq.node#monitoring (NodeJS 实现,但 Python 会类似)

    我考虑过其他模式,但我不确定 ROUTER/DEALERREQ/REP将满足您的要求。您应该阅读更多关于模式的内容,因为对于某些解决方案来说,每一种模式都更好。看这里:
  • ZMQ官方指南(大量示例和图片)
  • 简单的路由器/经销商示例:http://blog.scottlogic.com/2015/03/20/ZeroMQ-Quick-Intro.html
  • 关于zeromq - 如果客户端断开连接,使用 ZeroMQ 向特定客户端和队列发送回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33298009/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com