52 Matching Annotations
  1. Dec 2022
  2. Aug 2022
    1. RabbitMQ版可用于单体应用被拆解为微服务后不同微服务间的通信
      1. 接受券核销、购买信息(异步解耦、削峰填谷)
      2. 用户注册信息(异步解耦)
      3. 推送数据给ES(缓存同步)
      4. 分销活动,用户购买订单号+券id的最终一致性
      5. 延时队列,异步(取消订单)
    1. Interface ApplicationContextAware 和 InitializingBean来获取我们在Configuration class中声明的exchange, queue, binding beans并调用channel的相应方法来声明

      源码分析

    1. 当消息代理(broker)将消息发送给应用后立即删除。(使用AMQP方法:basic.deliver或basic.get-ok)

      这是AcknowledgeMode.NONE

    1. 这个需要利用Spring事务的一个特性TransactionSynchronization,注册一个同步钩子,自动把相关代码放到事务完成之后执行,我们使用拦截器拦截rabbitTemplate.convertAndSend方法,实现不用修改现有代码自动把发送MQ消息逻辑移到事务之外

      spring事务拦截机制

    1. see that the utilisation increases with the prefetch limit until we reach a limit of about 30. After that the network bandwidth limitation starts to dominate and increasing the limit has no further benefit
    1. 最好不要自定义输入输出在同一个类里面。这样,如果我们只调用生产者发送消息。会导致提示Dispatcher has no subscribers for channel
    1. 发送延迟消息非常简单,首先我们需要在生产者、消费者的配置文件中指定交换机的类型是延迟交换机

      rabbitmq特有的机制

    2. '''demoRoutingKey'''

      用的是双引号:'"demoRoutingKey"'

    1. Since it's an expression, you'll need quotes: 'cities' or if the same producer sends to both, something like headers['whereToSendHeader'].

      疑惑点

    1. 安装插件后会生成新的Exchange类型x-delayed-message,该类型消息支持延迟投递机制,接收到消息后并未立即将消息投递至目标队列中,而是存储在mnesia(一个分布式数据系统)表中,检测消息延迟时间,如达到可投递时间时并将其通过x-delayed-type类型标记的交换机类型投递至目标队列。
    1. 可以通过在类上监听队列,然后在类中写带有不同参数类型的方法,来接收不同的操作推送的信息

      这种方式不行,找不到相应的messageconverter,会报错。具体原因:https://stackoverflow.com/questions/64029154/spring-amqp-rabbitmq-object-sent-as-one-type-gets-converted-to-map-in-listener

    1. It will work if the @RabbitListener is defined at the method level instead of the class level because we can infer the generic type from the listener method parameter.

      @rabbitlistener在方法级别时,类型推导有用

    1. 发布-订阅、消费组、分区

      应该叫消费分区,(实际上就是queue)

    2. 实现延时队列的核心, 1. 安装插件 2,指明交换机为x-delayed-message。(指明x-delayed-type类型) 3,消息的header指明x-delay时间

    3. rabbiimq延时插件

      实现延时队列的核心, 1. 安装插件 2,指明交换机为x-delayed-message。(指明x-delayed-type类型) 3,消息的header指明x-delay时间

    4. args.put("x-delayed-type", "direct");

      路由type

    5. 编写配置类

      连接问题导致无法创建队列

    1. 我们看到两个消费者都收到了消息

      每个消费者实例都产生一个匿名的queue

    2. 使用SubscribableChannel和@Input注解连接到greetingChannel,消息数据将被推送这里

      这里怎么让rabbitmq创建匿名的queue的

    1. 发现是给用户授予了角色,只能登录控制台,但是没有给读写以及管理队列的权限,通过控制台admin按钮查看

      rabbitmq的virtual host有权限配置

    1. RabbitMQ的基因中没有延时队列这回事,它不能直接指定一个队列类型为延时队列,然后去延时处理,但是经过上面两节的铺垫,我们可以将TTL+DLX相结合,这就能组成一个延时队列。

      现在rabbitmq有延时队列插件可以实现延时队列功能 https://juejin.cn/post/6844904163168485383

    1. 如果配置了死信队列,它将被重新publish到死信交换机,死信交换机将死信投递到一个队列上,这个队列就是死信队列

      在队列上配置死信队列

    2. key = {"info","error","warning"}

      同一个queue也可以绑定不同的routingKey

    1. 都是可以根据 RoutingKey 把消息路由到不同的队列

      direct模式下,同一个routingkey可以绑定不同的queue,这样路由器可以分别发送同样的消息到相应的两个queue中

    2. Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割

      消息队列

    1. RabbitMQ很优秀,但RabbitMQ对消息堆积的支持并不好,当大量消息积压的时候,会导致 RabbitMQ 的性能急剧下降

      消息堆积会对性能有不小影响

  3. Jun 2022
  4. May 2022
  5. Nov 2019
  6. Feb 2019
  7. Apr 2018
    1. When the entire cluster is brought down, the last node to go down must be the first node to be brought online. If this doesn't happen, the nodes will wait 30 seconds for the last disc node to come back online, and fail afterwards.

      当整个群集关闭时, 最后一个要关闭的节点必须是第一个要联机的节点。 如果没有发生这种情况,则节点将等待30秒钟,以使最后一个光盘节点重新联机,然后再失败

    2. All data/state required for the operation of a RabbitMQ broker is replicated across all nodes. An exception to this are message queues, which by default reside on one node, though they are visible and reachable from all nodes

      运行RabbitMQ代理所需的所有数据/状态都将在所有节点上进行复制。

      一个例外是消息队列,默认情况下驻留在一个节点上,尽管它们可以从所有节点看到并且可以访问

      rabbitmq是AMQP的一种基于Erlang的实现

    1. rabbit_amqqueue_process是队列进程,rabbit_msg_store是负责进行消息持久化的进程

      rabbitmq_amqqueue_process队列进程和rabbit_msg_store消息持久化进程,都是RabbitMQ启动或者创建队列时创建的

    2. Erlang是一门动态类型的函数式编程语言,它也是一门解释型语言,由Erlang虚拟机解释执行。从语言模型上说,Erlang是基于Actor模型的实现。在Actor模型里面,万物皆Actor,每个Actor都封装着内部状态,Actor相互之间只能通过消息传递这一种方式来进行通信。对应到Erlang里,每个Actor对应着一个Erlang进程,进程之间通过消息传递进行通信。

      Erlanng是一门动态类型的函数式编程语言,也是一门解释型语言,由Erlang虚拟机解释执行

  8. Sep 2017