RocketMQ(一) 介绍

介绍

RocketMQ是 一款分布式, 队列模型的消息中间件, 具有以下特点:

能够保证严格的消息顺序

提供丰富的消息拉取模式

高效的订阅者水平扩展能力

实时的消息订阅机制

亿级消息堆积能力

安装

单机环境

采用Docker安装RocketMQ, 下面是Docker-compose文件

version: '3.5'
services:
  rmqnamesrv:
    image: foxiswho/rocketmq:server
    container_name: rmqnamesrv
    ports:
      - 9876:9876
    volumes:
      - ./data/logs:/opt/logs
      - ./data/store:/opt/store
    networks:
        rmq:
          aliases:
            - rmqnamesrv

  rmqbroker:
    image: foxiswho/rocketmq:broker
    container_name: rmqbroker
    ports:
      - 10909:10909
      - 10911:10911
    volumes:
      - ./data/logs:/opt/logs
      - ./data/store:/opt/store
      - ./data/brokerconf/broker.conf:/etc/rocketmq/broker.conf
    environment:
        NAMESRV_ADDR: "rmqnamesrv:9876"
        JAVA_OPTS: " -Duser.home=/opt"
        JAVA_OPT_EXT: "-server -Xms128m -Xmx128m -Xmn128m"
    command: mqbroker -c /etc/rocketmq/broker.conf
    depends_on:
      - rmqnamesrv
    networks:
      rmq:
        aliases:
          - rmqbroker

  rmqconsole:
    image: styletang/rocketmq-console-ng
    container_name: rmqconsole
    ports:
      - 8080:8080
    environment:
        JAVA_OPTS: "-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
    depends_on:
      - rmqnamesrv
    networks:
      rmq:
        aliases:
          - rmqconsole

networks:
  rmq:
    name: rmq
    driver: bridge

采用docker安装rocket-mq会有一个问题, 需要在配置文件中设置

brokerIP1=192.168.25.137

不然就会出现 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.0.120:10909> failed的错误

集群环境

双Master模式(推荐使用这种模式, 性能最好)

多Master多Slave的方式, 异步复制(可以保证实时消费)

多Master多Slave的方式, 同步双写(可以保证实时消费, 并且保证数据不丢失, 但是性能会较异步复制的方式稍微差一点)

基本设计

在RocketMQ里, 可以理解为没有类似于ActiveMQ的createQueue和createTopic的语法, 也就是点对点和发布订阅模型。RocketMQ不遵循JMS规范, 自由有一套自定义的机制, 简单来说都是使用订阅主题的方式去发送和接收任务的, 但是支持集群和广播两种消息模式。

集群模式: 设置消费端对象属性: MessageModel.CLUSTING, 这种方式就可以达到类似于ActiveMQ水平扩展负载均衡消费消息的实现, 比较特殊的是, 这种行为可以支持先发送数据(也就是生产端先传送数据到MQ), 消费端订阅主题发生在生产端之后也可以收到数据, 比较灵活。

consumer.setMessageModel(MessageModel.CLUSTERING);

广播模式: 设置消费端对象属性: MessageModel.BROADCASTING, 这种方式就是相当于生产端发送数据到MQ, 多个消费端都可以获得到数据。

consumer.setMessageModel(MessageModel.BROADCASTING);

在RocketMQ里, 有一个很重要的概念, 就是GroupName, 无论是生产端还是消费端, 都必须指定一个GroupName, 这个组名称, 是维护在应用系统级别上的, 比如在生产端指定一个名称: ProducerGroupName, 这个名称是需要由应用系统来保证唯一性的, 一类Producer集合的名称, 这类Producer通常发送一类消息, 且发送逻辑一直。同理消费端也是如此。

Topic主题, 每个主题表示一个逻辑上存储的概念, 而在其MQ上, 会有着与之对应的多个Queue队列, 这个是物理存储的概念

Producer

对于Producer, 他可以发送消息, 并且可以对多个主题去发送消息, 这种设计非常的灵活, 而且可以通过Tag定义一些简单的过滤, 通常已经满足我们90%的需求了, 如果更复杂的过滤场景下, 可能会使用filtersv组件

Producer的用途主要就是生产消息, 分布式模式下与单队列模式不一样, 如何能够充分利用分布式的优势, 将生产的消息分布到不同的队列中? Rocket-MQ提供了3种不同模式的Producer:

NormalProdcuer(普通)

OrderProducer(顺序)

TransactionProdcuder(事务)

普通模式: 使用传统的send发送消息即可。这种模式下不能保证消息的顺序一致性

顺序模式: rocketmq可以保证严格的消息顺序进行消费

遵循全局顺序的时候使用一个queue, 局部顺序的时候可以使用多个queue并行消费

事务模式: 支持事务方式对消息进行提交处理, 在rocketmq里事务分为两个阶段

第一个阶段为把消息传递给MQ, 只不过消费端不可见, 但是数据已经发送到broker上了

第二个阶段为本地消息回调处理, 如果成功的话返回COMMIT_MESSAGE, 则在broker上的数据对消费端可见, 失败则为ROLLBACK_MESSAGE, 消费端不可见

Consumer

在Rocketmq里, consumer被分为2类: MQPullConsumer和MQPushConsumer, 其实本质都是拉模式, 即consumer轮询从broker拉取消息

push方式里, consumer把轮询过程封装了, 并注册MessageListener监听器, 取到消息后, 唤醒MessageListener的consumeMessage()来消费, 对用户而言, 感觉消息是被推送过来的。

pull方式里, 取消息的过程需要用户自己写, 首先通过打算消费的Topic拿到MessageQueue的集合, 遍历MessageQueue集合, 然后对每个MessageQueue批量取消息, 一次取完后, 记录该队列下一次要取的开始offset, 直到取完了, 再换另一个MessageQueue.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值