前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rocketmq介绍

rocketmq介绍

作者头像
dogfei
发布2020-07-31 13:27:52
1.6K0
发布2020-07-31 13:27:52
举报
文章被收录于专栏:devops探索devops探索

RocketMQ功能介绍

代码语言:javascript
复制
<h4 class="heading" data-id="heading-2">
  1. 灵活可扩展性
</h4>

<p>
  RocketMQ 天然支持集群,其核心四组件(Name Server、Broker、Producer、Consumer)每一个都可以在没有单点故障的情况下进行水平扩展。
</p>

<h4 class="heading" data-id="heading-3">
  2. 海量消息堆积能力
</h4>

<p>
  RocketMQ 采用零拷贝原理(零拷贝,指的是应用内存与内核内存不存在拷贝)实现超大的消息的堆积能力,据说单机已可以支持亿级消息堆积,而且在堆积了这么多消息后依然保持写入低延迟。
</p>

<blockquote>
  <p>
    零拷贝主要的任务就是避免CPU将数据从一块存储拷贝到另外一块存储,主要就是利用各种零拷贝技术,避免让CPU做大量的数据拷贝任务,减少不必要的拷贝,或者让别的组件来做这一类简单的数据传输任务,让CPU解脱出来专注于别的任务。这样就可以让系统资源的利用更加有效。
  </p>
</blockquote>

<p>
  常见的零拷贝包含一下两种方式:
</p>

<ul>
  <li>
    使用 mmap + write 方式 优点:即使频繁调用,使用<span style="color: #ff0000;">小块文件传输</span>,效率也很高 缺点:不能很好的利用 DMA 方式,会比 sendfile 多消耗 CPU,内存安全性控制复杂,需要避免 JVM Crash 问题。
  </li>
  <li>
    使用 sendfile 方式 优点:可以利用 DMA 方式,消耗 CPU 较少,大块文件传输效率高,无内存安全新问题。 缺点:小块文件效率低于 mmap 方式,只能是 BIO 方式传输,不能使用 NIO。
  </li>
</ul>

<p>
  rocketmq选择的第一种,
</p>

<h4 class="heading" data-id="heading-4">
  3. 支持顺序消息
</h4>

<p>
  可以保证消息消费者按照消息发送的顺序对消息进行消费。顺序消息分为全局有序和局部有序,一般推荐使用局部有序,即生产者通过将某一类消息按顺序发送至同一个队列来实现。
</p>

<h4 class="heading" data-id="heading-5">
  4. 多种消息过滤方式
</h4>

<p>
  消息过滤分为在服务器端过滤和在消费端过滤。服务器端过滤时可以按照消息消费者的要求做过滤,优点是减少不必要消息传输,缺点是增加了消息服务器的负担,实现相对复杂。消费端过滤则完全由具体应用自定义实现,这种方式更加灵活,缺点是很多无用的消息会传输给消息消费者。
</p>

<h4 class="heading" data-id="heading-6">
  5. 支持事务消息
</h4>

<p>
  RocketMQ 除了支持普通消息,顺序消息之外还支持事务消息,这个特性对于分布式事务来说提供了又一种解决思路。
</p>

<h4 class="heading" data-id="heading-7">
  6. 回溯消费
</h4>

<p>
  回溯消费是指消费者已经消费成功的消息,由于业务上需求需要重新消费,RocketMQ 支持按照时间回溯消费,时间维度精确到毫秒,可以向前回溯,也可以向后回溯。
</p>

<p>
  

</p>

RocketMQ组件介绍

RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务

nameserver

nameserver在rocketmq中充当消息路由的提供者,通过主题topic来为生产者和消费者提供对应的消息队列列表,并且其几乎是无状态的,可以横向扩展和集群部署,节点之间无信息同步

Broker

broker即为消息队列本身,负责存储消息,接收生产者生产的消息,为消费者转发消息,同时还会存储与消息相关的元数据,包括消费者组,消息进度偏移和主题/队列信息,broker又分为master与slave,一个master可以对应多个slave,一个slave只能对应一个master,而且master也可以部署多个,他们之间的联系是通过brokername来关联的,通过设置相同的名字进行区分的,同时也可以通过brokerId来区分master和slave,当brokerid为0时表示master,非0表示slave。

每个broker与nameserver集群中的所有节点建立长连接,定时注册topic信息到所有的nameserver。

Producer

producer表示消息队列的生产者,producer会与nameserver中的一个节点建立长连接,并且是随机进行选择,定期从nameserver中获取topic路由信息,并与提供该topic信息的master建立长连接,且定时向master发送心跳。

producer group表示消息生产者组,具有相同角色(生产同一类消息)的消息生产者组合在一起,一个producer group下可以包含多个producer实例,也可以是多台机器,也可以是一台机器的多个进程,或者一个进程的多个producer对象。

Consumer

consumer表示消息消费者,consumer同样也会与nameserver集群中的一个节点建立长连接,定期获取topic路由信息,并向提供topic服务的master,slave建立长连接,且定时向master,slave发送心跳,consumer既可以从master订阅消息,也可以从slave订阅消息。

consumer group表示消息消费者组,同producer group类似,将具有相同角色的消息消费者组合在一起。

Topic

topic 消息的逻辑分类

Tag

tag是topic的进一步细分,可以在同一业务中通过引入标签来标记不同用途的消息

RocketMQ消息发送方式

主要有三种方式:

  • 同步
  • 异步
  • 单向

同步发送就是指 producer 发送消息后,会在接收到 broker 响应后才继续发下一条消息的通信方式。由于这种同步发送的方式确保了消息的可靠性,同时也能及时得到消息发送的结果,故而适合一些发送比较重要的消息场景,比如说重要的通知邮件、营销短信等等。在实际应用中,这种同步发送的方式还是用得比较多的

异步发送是指 producer 发出一条消息后,不需要等待 broker 响应,就接着发送下一条消息的通信方式。需要注意的是,不等待 broker 响应,并不意味着 broker 不响应,而是通过回调接口来接收 broker 的响应。所以要记住一点,异步发送同样可以对消息的响应结果进行处理。

由于异步发送不需要等待 broker 的响应,故在一些比较注重 RT(响应时间)的场景就会比较适用。比如,在一些视频上传的场景,我们知道视频上传之后需要进行转码,如果使用同步发送的方式来通知启动转码服务,那么就需要等待转码完成才能发回转码结果的响应,由于转码时间往往较长,很容易造成响应超时。此时,如果使用的是异步发送通知转码服务,那么就可以等转码完成后,再通过回调接口来接收转码结果的响应了。

单向发送,是一种单方向通信方式,也就是说 producer 只负责发送消息,不等待 broker 发回响应结果,而且也没有回调函数触发,这也就意味着 producer 只发送请求不等待响应结果。

由于单向发送只是简单地发送消息,不需要等待响应,也没有回调接口触发,故发送消息所耗费的时间非常短,同时也意味着消息不可靠。所以这种单向发送比较适用于那些耗时要求非常短,但对可靠性要求并不高的场景,比如说日志收集。

代码语言:javascript
复制
    <h1>
      RocketMQ 集群部署模式
    </h1>
    
    <p>
      1)单 master 模式<br /> 也就是只有一个 master 节点,称不上是集群,一旦这个 master 节点宕机,那么整个服务就不可用,适合个人学习使用。
    </p>
    
    <p>
      2)多 master 模式<br /> 多个 master 节点组成集群,单个 master 节点宕机或者重启对应用没有影响。<br /> 优点:所有模式中性能最高<br /> 缺点:单个 master 节点宕机期间,未被消费的消息在节点恢复之前不可用,消息的实时性就受到影响。<br /> 注意:使用同步刷盘可以保证消息不丢失,同时 Topic 相对应的 queue 应该分布在集群中各个节点,而不是只在某各节点上,否则,该节点宕机会对订阅该 topic 的应用造成影响。
    </p>
    
    <p>
      3)多 master 多 slave 异步复制模式<br /> 在多 master 模式的基础上,每个 master 节点都有至少一个对应的 slave。master<br /> 节点可读可写,但是 slave 只能读不能写,类似于 mysql 的主备模式。<br /> 优点: 在 master 宕机时,消费者可以从 slave 读取消息,消息的实时性不会受影响,性能几乎和多 master 一样。<br /> 缺点:使用异步复制的同步方式有可能会有消息丢失的问题。
    </p>
    
    <p>
      4)多 master 多 slave 同步双写模式<br /> 同多 master 多 slave 异步复制模式类似,区别在于 master 和 slave 之间的数据同步方式。<br /> 优点:同步双写的同步模式能保证数据不丢失。<br /> 缺点:发送单个消息 RT 会略长,性能相比异步复制低10%左右。<br /> 刷盘策略:同步刷盘和异步刷盘(指的是节点自身数据是同步还是异步存储)<br /> 同步方式:同步双写和异步复制(指的一组 master 和 slave 之间数据的同步)<br /> 注意:要保证数据可靠,需采用同步刷盘和同步双写的方式,但性能会较其他方式低。
    </p>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • RocketMQ功能介绍
  • RocketMQ组件介绍
    • nameserver
      • Broker
        • Producer
          • Consumer
            • Topic
              • Tag
              • RocketMQ消息发送方式
              相关产品与服务
              消息队列 CMQ 版
              消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档