rocketmq初识

概念说明

通常一个消息队列需要掌握的知识点有Topic(主体)、Producer(生产者)、Consumer(消费者)、Queue(队列)、Delivery Semantics(消息传递范式)

蛋疼的是不同的消息队列关于这些名词叫法不一样,含义也不是很精确。所以阿里起了一个项目OpenMessaging去发起首个分布式消息领域的国际标准。不过好像并没有多少人买账,但这并不妨碍我们按照这个规范去梳理学习消息队列的知识。

有兴趣的可以对照着看:https://github.com/openmessaging/specification/blob/master/specification-schema.md

rocketmq 官方文档已经说的比较清楚了,不再赘述

核心流程

rocketmq初识

消息写入与存储

消息是存储到broker中的,写到commit log中,先写内存,在刷盘。
存储到磁盘中是直接以 文件系统的方式。为了提高磁盘写入效率,都是顺序写,这样所有的topic都放在了一起, 这一点与kafka不同,kafka以topic作为基本单元。

单个commitlog 文件大小为1G,之后滚动写入不同文件。

消息读取

消费者先从ConsumeQueue(消息逻辑队列)读取持久化消息的offset(偏移量)、size(大小)和消息Tag的HashCode值,再从CommitLog中读取消息的真正实体内容部分;

此外为了快速定位消息,还有一种文件叫index,在给定消息 Topic 和 Key 的前提下,可以快速定位消息

rocketmq初识

注意点

使用消息队列时,需要注意的地方

消息保存时间

rocketmq默认保存72小时,超过了,无论有没有消费都会丢弃,通过参数 fileReserverdTime来配置。
注意这个配置是全局配置,没法针对不同的topic设置不同的值,原因在上面已经提到过了,因为rocketmq存储消息是所有的topic放在一起的。

消息有序

MessageListenerOrderly

消息丢失

理论上可以保证不丢失(接受消息重复,以及一定程度的写入性能下降),

生产端
同步模式,或者异步模式时需要处理发送失败情况

所以保证消费的幂等性是必须的
broker端
为了保证不丢,需要开启同步刷盘(防止内存数据丢失),同步复制(防止单点故障)。
这样是有性能损失的。刷盘机制参数 flushDiskType 默认是 ASYNC_FLUSH,broker 会消息一定量后再刷盘,显然性能更好。

消费端
消费完再CONSUME_SUCCESS
生产端,消费端都有可能因为网络问题导致消息成功了,但是ack没有成功,所以会重复投递/消费。所以 Delivery Semantics一般选择 At least once。应用程序必须要保证 消费的幂等性

写入效率/消费效率/消费积压

发送端
异步刷盘,异步复制情况下,两台4核8G,大小100Byte,写入速度能够达到几万。

通常broker端不存在瓶颈。但是由于一般业务是是共用一个集群的,各个业务线都使用起来,流量还是很高的,需要监控报警,及时进行水平扩容。
如果能够接受延迟,producer可以批量提交,发送效率更高。

消费端
取决于消费逻辑是否耗时,默认单机处理线程 consumeThreadMax (默认20)如果消费端服务时独立的,可以调整调整更大,提高单机处理速度。

无法提高单机处理速度的时候,可以集群水平扩展。不过不是无限水平扩展的,超过 defaultTopicQueueNums 订阅队列数无效,该值默认值为4

应用场景

为什么需要消息队列,这个问题都被讲烂了,经典三大场景还是削峰填谷、异步处理、服务解耦。
个人觉得这边总结的比较全面。https://github.com/openmessaging/specification/blob/master/usecase.md

重点介绍下 rpc场景,注意这个rpc不是rpc调用。是同步消息,相当于两次rpc。client发到server。server处理完再发到client。

rocketmq初识
这个通常用于服务间的同步处理。比如有个核心服务A,某个请求里面需要有个高耗时的操作,为了不影响A服务,用了一个B服务来处理这个操作。这时候就会用到 rpc

参考

https://tech.meituan.com/2016/07/01/mq-design.html

http://tinylcy.me/2019/the-design-of-rocketmq-message-storage-system/

Original: https://www.cnblogs.com/stoneFang/p/12985326.html
Author: stoneFang
Title: rocketmq初识

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/586692/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java 元注解

    学习地址:https://blog.csdn.net/sw5131899/article/details/54947192 java注解使用是相当频繁,特别是在搭建一些框架时,用到…

    Java 2023年6月5日
    091
  • Effective Java 第三版——83. 明智谨慎地使用延迟初始化

    Tips书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code注意,书中的有些代码里方法是基于Java 9…

    Java 2023年5月29日
    084
  • java学习之JSON

    JSON可以说是javascript的一种数据类型,我们学习JSON是为了在客户端的数据给读取出来,官方的解释是:概述:JSON(JavaScript Object Notatio…

    Java 2023年6月13日
    080
  • java8 lambda操作

    package com.simon.java8; import java.util.*; import java.util.stream.Collectors; public cl…

    Java 2023年5月29日
    091
  • Tomcat中的观察者模式 (Lifecycle)

    几个重要的类,接口 LifeCycle : 主题接口 LifeCycleBase : 抽象的主题实现 LifeCycleListener : 观察者 具体分析 public int…

    Java 2023年6月6日
    081
  • java poi

    POI and EasyExcel Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java对Microsoft Of…

    Java 2023年6月9日
    075
  • Django基础学习之Cookie 和 Sessions 应用

    在Django里面,使用Cookie和Session看起来好像是一样的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX…

    Java 2023年5月29日
    051
  • B树索引的相关概念

    B树索引的相关概念 索引与表一样,也属于段(segment)的一种。里面存放了用户的数据,跟表一样需要占用磁盘空间。只 不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样…

    Java 2023年6月9日
    085
  • 第三方支付sdk(包含微信(v2),支付宝)

    1.导入maven cn.springboot best-pay-sdk 1.3.0.BETA Original: https://www.cnblogs.com/h-w-b/p/…

    Java 2023年6月14日
    0109
  • 基于LSM的Key-Value数据库实现WAL篇

    上篇文章简单的实现了基于LSM数据库的初步版本,在该版本中如数据写入到内存表后但还未持久化到SSTable排序字符串表,此时正好程序崩溃,内存表中暂未持久化的数据将会丢失。 引入W…

    Java 2023年6月16日
    087
  • Java线程基础学习笔记

    进程是指运行中的程序 进程是程序的一次执行过程,或是正在运行的一个程序,是动态过程:有它自身的产生、存在和消亡的过程 线程是由进程创建的,是进程的一个实体。一个进程可以拥有多个线程…

    Java 2023年6月8日
    074
  • 数据库架构演变概要

    一. 背景 为了适应业务增长,数据库数据量快速增长,性能日趋下降,稳定性不佳的实际情况,急需架构逐步演变适应未来的业务发展。 二. 现状 【稳定性】数据库为单点,没有高可用和稳定性…

    Java 2023年6月8日
    066
  • 堆排序获取TopN

    package com.zjl.tool.sort; /** * 求前面的最大K个…

    Java 2023年6月16日
    078
  • 搭建 vue-cli 和 引入 Element-ui 最完整的入门例子(手把手)

    搭建 vue-cli 脚手架 安装 git 安装 node 并配置环境变量,使用 zip 版本 检查 node 是否安装成功 node -v 使用淘宝镜像 npm config s…

    Java 2023年6月5日
    0148
  • 限流常见方案

    限流常见方案 我歌月徘徊,我舞影零乱。醒时相交欢,醉后各分散。 一、限流思路 常见的系统服务限流模式有:熔断、服务降级、延迟处理和特殊处理四种。 1、熔断 将熔断措施嵌入到系统设计…

    Java 2023年6月5日
    073
  • 白话电子签章原理及风险

    因为业务需要近来在对接一个线上的电子签章平台, 签完的效果就是在PDF上盖一个红色的章。内部过程沟通中发现,对这个红色章背后的证明逻辑,技术原理,能够了解的比较清楚的人还是很少的。…

    Java 2023年6月15日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球