zoukankan      html  css  js  c++  java
  • 【SpringCloud】Spring Cloud Stream 消费组和消息持久化(二十四)

      本章介绍Spring Cloud Stream 消费组和消息持久化,Spring Cloud Stream 入门参考:【SpringCloud】Spring Cloud Stream 消息驱动(二十三)

    Spring Cloud Stream消费组

      多数情况,生产者发送消息给某具体微服务时只希望被消费一次,按照上面我们启动两个应用的例子,虽然它们同属一个应用,但是这个消息出现了被重复消费两次的情况。为了解决这个问题,在Spring Cloud Stream中提供了消费组的概念

    案例说明

      本章案例在也是使用上一章的案例,架构如下,其中消息消费者8802与消息消费者8803,应用名称和代码一样,

      

      消息消费者(8802|8803)配置:

     1 # 端口
     2 server:
     3   port: 8802
     4 
     5 spring:
     6   application:
     7     name: cloud-stream-consumer
     8   cloud:
     9     stream:
    10       binders:
    11         # 表示定义的名称,用于binding的服务信息
    12         defaultRabbit:
    13           # 消息组件类型
    14           type: rabbit
    15           # 设置rabbitmq的相关配置的环境配置
    16           environment:
    17             spring:
    18               rabbitmq:
    19                 host: 127.0.0.1
    20                 port: 5672
    21                 username: guest
    22                 password: guest
    23       # 服务的整合处理
    24       bindings:
    25         # 这个名字是一个通道的名称
    26         input:
    27           # 表示要使用的Exchange 名称定义
    28           destination: studyExchange
    29           # 设置消息类型,本次为json,文本则设置"text/plain"
    30           content-type: application/json
    31           # 设置要绑定的消息服务的具体设置
    32           binder: defaultRabbit
    33           # 消费分组
    34 #          group: testA
    35 
    36 eureka:
    37   client:
    38     service-url:
    39       defaultZone: http://localhost:8761/eureka

      同一消息被同一服务多处消费现象

      测试流程:

      1、启动相关项目

      2、查看Eureka注册中心,同一服务CLOUD-STREAM-CONSUMER,有2个节点

        

      3、查看RabbitMQ的Web后台,发现有2个不同的Queue,绑定了studyExchange

        

      4、访问地址:http://localhost:8801/sendMessage,发送消息

        发现消息消费者(8802|8803)2个节点,都收到同一条消息,并进行了处理

        说明:出现消息被同一种服务重复消费的问题

      同一消息被同一服务分组消费

      1、在消息消费者(8802|8803)2个节点的配置文件中配置组属性

    1 spring.cloud.stream.bindings.input.group = testA

      2、重新相关项目

      3、查看RabbitMQ的Web后台,发现只有一个studyExchange.testA的Queue,

        且studyExchange.testA绑定了studyExchange,里面有2个Chanal

        

      4、访问地址:http://localhost:8801/sendMessage,发送消息

        发现一条消息只会被1个消费者,获取并消费。

        发送多条消息,消息有消费者轮询的方式消费

    Spring Cloud Stream消息持久化

      消费者设置分组后

      1、关闭消费者服务

      2、查看RabbitMQ的Web后台,发现studyExchange.testA的Queue,并没有被删除

      3、访问地址:http://localhost:8801/sendMessage,发送消息,

        发现消息继续发送到了studyExchange.testA中

      4、启动消费者服务,发现消费者服务能够消费到,服务未启动时提供者发送的消息

        说明已到到消息持久化的效果

      注:消费者未设置分组时,关闭消费者服务,对应的queue会理解被删除,那么提供者也就无法方队列中发送消息了

      

      

  • 相关阅读:
    用perl做数据库迁移
    【记凡客诚品面试】需要规划的人生,需要专精的技术+京东笔试了。。。
    初学者应该看的东西
    mysql安装图解 mysql图文安装教程(详细说明)
    EMS SQL Manager for MySQL
    全局配置文件也面向服务了~续(对性能的优化)
    推荐几款软件界面模型设计工具
    asp.net中实现文件上传
    UltraEdit支持python语法高亮
    理解并发编程中的几种并发方式
  • 原文地址:https://www.cnblogs.com/h--d/p/12840234.html
Copyright © 2011-2022 走看看