• RabbitMq


    真实的项目如果 交换器/ 队列很多  建议在管理页面新建exchange / queue/ rootingKey /vhost, 而不要写死在springboot项目里

    1. camel按rooting key发送消息: 最推荐
    2. 根据路由键 和mq服务所有的路由键比对 附和  消息就发送给到匹配的队列里
    3. .to("rabbitmq:sino.nannan?routingKey=sino.key&skipExchangeDeclare=true&skipQueueDeclare=true").log("${body}").end();
    4. 按queueName发送消息: 推荐
    5. .to("rabbitmq:sino.nannan?queue=sino.queueName&skipExchangeDeclare=true&skipQueueDeclare=true").log("${body}").end();
    6. 按交换器名称和类型 发送消息: (不常用, 用在fanout)
    7. .to("rabbitmq:sino.nan?exchangeType=fanout&skipExchangeDeclare=true&skipQueueDeclare=true").log("${body}").end();
    8. camel按queueName接收消息: 推荐
    9. from("rabbitmq:sino.nannan?exchangeType=topic&autoDelete=false&queue=sino.queueName&skipQueueDeclare=true")
    10. camel整合rabbitmq引入依赖
    11. org.apache.camel
    12. camel-spring-boot-starter
    13. 2.22.2
    14. org.apache.camel
    15. camel-rabbitmq
    16. 2.22.2

    0. add virtual host   用于逻辑隔离

    1. Connections

    2. add exchange (需选择virtual host)

    1. RabbitMQ 提供了四种主要的交换机类型(Exchange Types),用于将消息路由到适当的队列(Queues)。每种交换机类型都有其特定的行为和用途:
    2. Direct Exchange:
    3. 行为: 通过完全匹配路由键 (Routing Key) 将消息发送到与其绑定的队列。
    4. 用法: 当你希望消息被准确地路由到一个指定的队列时使用。
    5. 示例: 如果消息的路由键是 "info" 并且队列绑定的路由键也是 "info",则该消息会被路由到该队列。
    6. Fanout Exchange:
    7. 行为: 将消息广播到所有绑定到该交换机的队列,不考虑路由键。
    8. 用法: 当你希望消息复制并发送到所有绑定队列时使用,例如广播消息。
    9. 示例: 一个 Fanout 交换机可以用来将同一消息发送到多个服务或日志系统。
    10. Topic Exchange:
    11. 行为: 根据模式匹配路由键,将消息发送到符合模式的队列。模式可以包含通配符,例如 * 表示一个单词,# 表示零个或多个单词。
    12. 用法: 当你需要基于模式或主题进行复杂的路由时使用。
    13. 示例: 路由键 "user.*" 可以匹配 "user.info",而 "user.#" 可以匹配 "user.info""user.info.details"
    14. Headers Exchange:
    15. 行为: 根据消息的属性(头部信息)进行路由,而不是依赖于路由键。头部信息可以包括任意键值对。
    16. 用法: 当你需要基于多个属性进行复杂路由时使用。
    17. 示例: 你可以配置交换机根据头部信息如 {"x-match": "all", "format": "pdf", "type": "report"} 进行路由,只有消息头部包含这些键值对时才会被路由到绑定的队列。
    18. 这四种交换机类型提供了不同的消息路由机制,使得 RabbitMQ 能够灵活地适应各种消息分发需求。选择合适的交换机类型可以有效地优化消息传递的效率和准确性

    3. add a new queue (需选择virtual host)

     4. 对新建的queue  (交换器 和 rooting_key 绑定)

    5.  * 和 # 在 RabbitMQ 中用作路由键的通配符

    1. 在 RabbitMQ 中,"routing key"(路由键)是用于消息路由的关键部分。当消息发布到交换机(exchange)时,交换机会根据消息的路由键将消息路由到相应的队列(或者其他交换机,取决于交换机类型)。
    2. 符号 "*""#" 在 RabbitMQ 中有特定的意义,它们被用作路由键的通配符:
    3. "*"(星号):
    4. 在路由键中表示一个单词(单词由点 "." 分隔)的通配符。
    5. 例如,路由键 *.info 匹配 app.info、api.info,但不匹配 app.error。
    6. "#"(井号):
    7. 在路由键中表示零个或多个单词的通配符。
    8. 例如,路由键 app.# 匹配 app.error、app.info、app.system.error 等。
    9. 这些通配符可以帮助在消息路由时进行灵活的匹配,使得你可以定义复杂的路由规则,而不需要为每个可能的情况都单独定义一个绑定。
    10. 举例来说,如果你有一个交换机,它绑定了一个队列,绑定键为 *.error,那么这个队列将接收到所有以 .error 结尾的路由键的消息,例如 app.error、db.error 等。
    11. 因此,"*""#" 是 RabbitMQ 中用来实现灵活消息路由的重要工具。

    6. Channel的理解

     虽然你不能直接在管理界面上创建或关闭Channel,但你可以通过管理界面创建和管理队列、交换器、绑定等,这些都是通过Channel在后台执行的

    7. rabbitmq 发布订阅模式 是指 fanout交换机吗? 是

    topic交换机支持复杂的路由规则。

    1. @Override
    2. public void configure() {
    3. from("timer://foo?period=10000").setBody().constant("22222").to("direct:sendToFanout");
    4. // 发送消息到fanout交换机
    5. from("direct:sendToFanout").to("rabbitmq:sino.nan?exchangeType=fanout&autoDelete=false&skipQueueDeclare=true")
    6. .log("csx data:" + "${body}");
    7. }
    8. 将队列名称分别为 nan1 nan2的队列与fanout类型的交换机sino.nan 绑定.
    9. 一个项目里对nan1 nan2 同时监听消费就会报错,
    10. Caused by: org.apache.camel.FailedToStartRouteException: Failed to start route route2 because of Multiple consumers for the same endpoint is not allowed: rabbitmq://sino.nan?autoDelete=false&exchangeType=fanout&queue=nan1&skipQueueDeclare=true
    11. @Override
    12. public void configure() {
    13. from("rabbitmq:sino.nan?exchangeType=fanout&autoDelete=false&queue=nan1&skipQueueDeclare=true")
    14. // 这里可以添加更多异常处理逻辑,如重试、路由到错误队列等
    15. .log("推送到soa1: ${body}")
    16. .end();
    17. }
    18. @Override
    19. public void configure() {
    20. from("rabbitmq:sino.nan?exchangeType=fanout&autoDelete=false&queue=nan2&skipQueueDeclare=true")
    21. // 这里可以添加更多异常处理逻辑,如重试、路由到错误队列等
    22. .log("推送到soa1: ${body}")
    23. .end();
    24. }

    是的,RabbitMQ中的发布订阅模式通常指的是使用fanout类型的交换机。在发布订阅模式下,消息生产者发送消息到fanout交换机,交换机并不处理任何路由键(routing key),而是简单地将消息广播到所有与之绑定的队列上。每个绑定到fanout交换机的队列都会收到消息的一个拷贝,进而可以供给绑定到这些队列的消费者进行处理。

    发布/订阅模式(Publish/Subscribe)是 RabbitMQ 中常见的一种消息传递模式,用于将消息广播给多个消费者。在这种模式中,消息发送者(发布者)将消息发送到一个交换机(exchange),交换机将消息广播到所有与之绑定的队列,然后消费者(订阅者)可以从这些队列中接收消息

    1. direct (发布与订阅完全匹配)
    2. fanout 广播 (没有路由键RouteKey的概念)
    3. topic 主题,规则匹配
    4. direct交换器相对来说比较简单,匹配规则为:如果路由键匹配,消息就被投送到相关的队列
    5. fanout交换器中没有路由键的概念,他会把消息发送到所有绑定在此交换器上面的队列中。
    6. topic交换器你采用模糊匹配路由键的原则进行转发消息到队列中
    7. 交换器和队列的关系:
    8. 交换器是通过 路由键 和 队列 绑定在一起的, 如果消息拥有的 路由键 跟队列 和 交换器 的路由建匹配, 那么消息就会被路由到该绑定的队列中
    9. 也就是说, 消息首先会经过交换器, 接下来交换器在通过路由键值 匹配分发消息到具体的队列中。路由键 可以理解为 匹配的规则
    10. 总结
    11. fanout交换机:它将消息广播到所有绑定到它的队列,不考虑路由键。
    12. 发布订阅模式:通过使用fanout交换机,可以实现一个生产者将消息发送给多个消费者的模式,每个消费者都有自己的队列来接收消息。
  • 相关阅读:
    结构体几种实用的用法
    ES (ElasticSearch) 简易解读(二)ES安装及集群的搭建
    [Java、Android面试]_21_Dalvik VM与JVM的区别
    java版Spring Cloud之Spark 离线开发框架设计与实现
    ASEMI-GBU808整流桥如何测好坏
    交付实施工程师是做什么的?
    springboot连接mysql数据库,密码正确却始终报密码错误问题
    面试字节跳动—真实面试题分享
    【数据库】B树、B+树、索引
    python 下载图片按图片地址路径创建对应文件夹
  • 原文地址:https://blog.csdn.net/qq_29883183/article/details/139856170