当前位置: 首页 > 知识库问答 >
问题:

如何将消息发布到具有高tps的rabbitmq,多线程

万俟震博
2023-03-14

由于channel不是线程安全的,所以我可以在发布之前同步channel实例,或者每次需要时创建一个channel并关闭它。

但在我看来,由于锁定或创建和破坏通道的代价,这两种方法都没有很好的性能。

共有1个答案

卜季萌
2023-03-14

所以,第一件事。通道不是连接。在RabbitMQ中,通道与应用程序会话是一样的,而连接表示与服务器的底层TCP会话。这个答案很好地解释了其中的一些问题。

TCP会话的创建成本很高,因此它们的生存期往往在任何特定工作线程的生存期之外。创建通道非常便宜--服务器所做的只是为您的通道标识符分配一个整数,您就有了一个新的通道。

RabbitMQ上的大多数操作在失败时会关闭通道。这样做是因为这样做没有实际后果。如果他们关闭了底层连接,那会给应用程序带来很多问题。

消费者的寿命与渠道有关。当通道关闭时,连接的使用者也会关闭。将您的使用者对象(工作线程)设计成能够在发生这种情况时获得连接并创建新通道,然后重新订阅它们自己。

避免跨线程共享通道。一个线程=一个通道。

虽然我对Java客户机没有任何特别的经验,但我不认为锁应该是必要的,而且我当然希望实现不会做一些使通道不是轻量级的事情。

关于Java客户机,我认为您可以假设通道操作(读和写等)不是线程安全的,这就是为什么您希望坚持一个线程/一个通道范例的原因。我认为您可以假设创建通道(一个连接操作)是线程安全的。

 类似资料:
  • 本文向大家介绍Python如何将消息发布到RabbitMQ,包括了Python如何将消息发布到RabbitMQ的使用技巧和注意事项,需要的朋友参考一下 示例 从导入库开始。 接下来,我们需要打开与RabbitMQ服务器的连接。 之后,我们需要建立一个频道。每个连接可以有多个通道,通常在执行多线程任务时,建议(但不是必需)每个线程一个。 建立频道后,我们就可以开始准备信息了。 现在,我们可以通过简单

  • 主要内容:8. 发布高级确认,8.1 发布确认SpringBoot版本,8.2 回退消息,8.3 备份交换机8. 发布高级确认 在生产环境中由于一些不明原因,导致RabbitMQ重启,在RabbitMQ重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复 于是,我们开始思考,如何才能进行RabbitMQ的消息可靠投递呢?特别是在这样比较极端的情况下,RabbitMQ集群不可用的时候,无法投递的消息该如何处理呢? 8.1 发布确认SpringBoot版本 8.1.1 发布确认方案 当交换机

  • 主要内容:一、前情回顾,二、业务场景介绍,三、初步落地一、前情回顾 之前给大家聊了一下,面试时如果遇到消息中间件这个话题,面试官上来可能问的两个问题: 你们的系统架构中为什么要引入消息中间件? 系统架构中引入消息中间件有什么缺点? 关于这两个问题的回答,可以参见之前的两篇文章: 《 为什么要使用MQ消息中间件?这几个问题必须拿下!》 《 用了MQ消息中间件后,我开始后悔了...》 在问完这两个问题之后,不同风格的面试官可能会展开不同的发问。 针对那种

  • 我是老学校窗户蔚蓝建筑师。使用服务总线主题将消息传递给工作者角色。

  • 发布确认原理 生产者将信道设置成 confirm 模式,一旦信道进入 confirm 模式,所有在该信道上的消息都会被指派一个唯一的 ID(从一开始),一旦消息被投递到所有匹配的队列后,broker 就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了 如果消息和队列是持久化的,那么确认消息会在将消息写入磁盘后发出,broker 回传给生产者的确认消息中 ,

  • 问题内容: python的日志记录模块是否有一种简单的方法可以将具有DEBUG或INFO级别的消息以及具有更高级别的消息发送到不同的流? 反正这是个好主意吗? 问题答案: 不一定是一个好主意(将信息和调试消息混入正常输出中可能会造成混淆!),但可行,因为您可以有多个处理程序对象和每个对象的自定义过滤器,以便选择日志记录每个处理程序要处理的内容。