消息中间件之RocketMQ(二)

RocketMQ支持的消息类型

了解之前,首先要熟悉RocketMQ中的组件架构设计
在这里插入图片描述

1.顺序消息

  • 将同一个订单(即具有相同的orderId)的消息按状态先后顺序消费的,所以消息生产者调用send方法发送时需要传入MessageQueueSelector接口的,实现类,将orderId相同的消息放入同一个MessageQueue中,比如对orderId进行取余,消费端还需要实现MessageListenerOrderly接口用于消费,有序的消息,MessageListenerConcurrently接口消费的消息是无序的
  • 顺序消费的原理是确保将消息投递到同一个队列中,在队列内部RocketMQ保证先进先出,而同一个队列会被投递到同一个消费者实例,再由消费者拉取数据进行消费。在消费者内部会维护本地队列锁,以保证当前只有一个线程能够进行消费,所拉到的消息先被存入消息,处理队列中,然后再从消息处理队列中顺序获取消息用MessageListenerOrderly进行消费(这也是在顺序消费时监听消息要实现MessageListener接口)的原因
  • 消费者端的顺序消费,需要有个前提,那就是保证Producer、Broker要保证有序,缺一不可

1.1 Producer

在默认情况下,消息发送者会采取Round Robin轮询方式把消息发送到不同的MessageQueue(分区队列),而消费者消费的时候也从多个MessageQueue上拉取消息,这种情况下消息是不能保证顺序的.
而只有当一组有序的消息发送到同一个MessageQueue上时,才能利用MesageQueue先进先出的特性
保证这一组消息有序

1.2 Broker

Broker中一个队列内的消息是可以保证有序的

1.3 Consumer

仍然是乱序的,消费者端要保证消息是有序的,就需要按队列一个一个地来取消息,即取完一个队列的消息后,再去取下一个队列的消息。而给Consumer注入的MessageListenerOrderly对象,在RocketMQ内部就会通过,锁队列的方式保证消息是一个一个队列来取的,MessageListenerConcurrently这个消息监听器不会锁队列,每次都是从多个Message中取一批数据(默认不超过32条),因此也无法保证消息有序

2. 延时消息

延时消息实现的效果就是再调用producer.send方法后,消息并不会立即发送出去,而是会等一段时间再发送出去,这是RocketMQ特有的一个功能,延迟时间的设置就是在Message消息对象上设置一个延迟级别message.setDelayTimeLevel(3);开源版本的RocketMQ中,对延迟消息并不支持任意时间的延迟设定(商业版本中支持),而是只支持18个固定的延迟级别,1到18分别对应messageDelayLevel = 1s 5s 10s 30s 1m 2m 3m 4m…2h,而这18个延迟级别也支持自行定义,不过一般情况下最好不要自定义修改

3.批量消息

批量消息是指将多条消息合并成一个批量消息,一次发送出去,这样的好处是可以减少网络IO,提升吞吐量,官网注释,如果批量消息大于1MB就不要使用一个批次发送,而要拆分成多个批次消息发送,也就是说,一个批次消息的大小不要超过1MB,实际使用时,这个1MB的限制可以稍微扩大点,实际的最大的限制是大约4MB.但是使用批量消息时,这个消息长度确实是必须考虑的一个问题,而且批量消息的使用是有一定限制的,这些消息应该有相同的Topic,相同的waitStoreMsgOK,而且不能是延迟消息、事务消息等

4.过滤消息

大多数情况下,可以使用Message的Tag属性来简单快速地过滤信息,主要时看消息消费者
tag是RocketMQ中特有的一个消息属性,RocketMQ的最佳实践中就建议,使用RocketMQ时,
一个应用可以就用一个Topic,而应用中的不同业务就用tag区分,但是,这种方式有一个很大的限制,
就是一个消息只能有一个tag,在一些比较复杂的场景就有点不足了,可以使用SQL表达式来对消息进行过滤,SQL92语法

5.事务消息

请见消息中间件之RocketMQ事务消息流程,这里不再重复赘述

系统参数调优相关

1.JVM参数

1.配置RocketMQ的JVM内存大小
runserver.sh需要定制nameserver的内存大小,
runbroker.sh中需要定制broker的内存大小
这些默认的配置可以认为都是经过检验的最优化配置,但是在实际情况中还需要根据服务器的实际情况进行调整
以runbroker.sh中对G1GC的配置举例,在runbroker.sh的关键配置
-XX:+UseG1GC(使用G1垃圾回收器)
-XX:G1HeapRegion(将G1的region块大小设为16M)
-XX:G1ReservePercent(在G1的老年代中预留25%空闲内存,这个默认值是10%)
-XX:InitiaatingHeapOccupancyPercent=30(当堆内存的使用率达到30%之后就会启动G1垃圾回收器尝试回收垃圾,
默认值是45%,RocketMQ把这个参数调小了,也就是提高了GC的频率,但是避免了垃圾对象过多,
一次垃圾回收时间太长的问题)

2.Linux内核参数定制。

在部署RocketMQ的时候,还需要对Linux内核参数进行一定的定制

  • ulimit,需要进行大量的网络通信和磁盘IO
  • vm.extra_freee_kbytes,告诉VM在后台回收(kswapd)启动的阈值与直接回收(通过分配进程)的阈值之间保留额外的可用内存,RocketMQ使用此参数来避免内存分配中的长延迟(与具体内核版本相关)
  • vm.min_free_kbytes,如果将其设置为低于1024KB,将会巧妙地将系统破坏,并且系统在高负载下容易出现死锁
  • vm.max_map_count,限制一个进程可能具有的最大内存映射数,RocketMQ将使用mmap加载CommitLog和ConsumeQueue,因此建议将此参数设置较大的值
  • vm.swappiness,定义内核交换内存页面的积极程度,较高的值会增加攻击性,较低的值会减少交换量,建议将值设置为10来避免交换延迟
  • vm.descriptor limits,RocketMQ需要为文件(CommitLog和ConsumeQueue)和网络连接打开文件描述符,建议设置文件描述符的值尽可能地调大 如:655350,CentOS7中的配置文件都在/proc/sys/vm目录下,RocketMQ的bin目录下有个os.sh里面设置了RocketMQ建议的系统内核参数,可以根据情况进行调整
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/345778.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sulfo Cy3 hydrazide,磺化-Cy3-酰肼,可用于与生物分子的羰基衍生物偶联

您好,欢迎来到新研之家 文章关键词:Sulfo-Cyanine3-hydrazide,Sulfo Cy3 hydrazide,Sulfo Cyanine3 HZ,磺化 Cy3 酰肼,磺化-Cy3-酰肼 一、基本信息 产品简介:Sulfo-Cyanine3-hydrazide能够与…

C#使用DateTime.Now.AddDays方法获取任一天的信息

目录 一、使用DateTime对象的AddDays方法获取任一天信息方法 二、举例说明获取昨天的信息 三、涉及到的知识点 1. MessageBox.Show()中信息分行的办法 使用DateTime.Now属性可以得到当前的日期信息,此时调用ToString方法,并在该方法中添加…

封装 element el-date-picker时间选择区间

基于el-date-picker 处理满足项目需求。&#xff08;&#xff1a;最多选择7天&#xff09; 效果&#xff1a; 1 大于当前时间的以后日期禁选。2 选中时间的前后七天可选 &#xff08;最多可查询7天数据&#xff09;3 <template><section class"warning-contai…

k8s---helm

Helm是什么&#xff1f; 在没有helm之前。部署一个服务&#xff0c;需要deployment、service、ingress、挂在卷等等相关配置都需要人工来配置。 helm的作用就是通过打包的方式&#xff0c;把需要人工编写的配置集成在一起。是一键式的部署服务。类似于yum功能。 由官方提供的…

JDK 版本切换工具 JEnv

1. 下载 JEnv 包 下载地址&#xff1a; JEnv-for-Windows 下载 JEnv.zip 然后解压缩&#xff0c;放到一个目录下&#xff0c;我这里放到了目录&#xff1a;D:\Program Files\JEnv 2. 将 JEnv 添加到环境变量 首先先在自己的电脑上去下载 JAVA 的各个版本&#xff0c;我这里…

webassembly003 whisper.cpp的python绑定实现+Cython+Setuptools

python绑定项目 官方未提供python的封装绑定&#xff0c;直接调用执行文件 https://github.com/stlukey/whispercpp.py提供了源码和Cpython结合的绑定 https://github.com/zhujun1980/whispercpp_py提供了ctype方式的绑定&#xff0c;需要先make libwhisper.so Pybind11 bi…

全网盘点内网穿透端口映射工具大整理,近百种端口映射工具使用方法介绍以及特性和优缺点分析

全网盘点内网穿透端口映射工具大整理&#xff0c;近百种端口映射工具使用方法介绍以及特性和优缺点分析。 “端口映射”通俗来说就是将外网主机的IP地址端口映射到内网中一台机器&#xff0c;提供相应的服务。内网相通&#xff0c;电因特网对外开放服务或者接收大数据&#xff…

【Leetcode】410. 分割数组的最大值

文章目录 题目思路1.max_element2.partial_sum3.upper_bound4.distance 代码运行结果 题目 题目链接 给定一个非负整数数组 nums 和一个整数 k &#xff0c;你需要将这个数组分成 k 个非空的连续子数组。 设计一个算法使得这 k 个子数组各自和的最大值最小。 示例1&#xff1…

JS中splice方法的用法总结

1. 概述 JavaScript中的splice()方法是用于增加、删除或替换数组中的元素。这个方法可以实现数组的细粒度操作,非常灵活和强大。 2. 语法 splice()方法的语法如下所示: start:必需,表示开始删除或插入的索引位置。如果为负数,则从数组的末尾开始计算。deleteCount:可选…

全球地面实测凋落物(Litterfall) 数据集

1. 研究背景 [3] 主要结论&#xff1a;作者结合litterfall数据和SIF/EVI数据&#xff0c;揭示了物候的规律 1. 对于光照和降水异步的地区&#xff08;Rclimate<0&#xff0c;背景是红色&#xff09; 紫色点&#xff08;赤道地区&#xff09;&#xff1a;落叶和长叶都在…

windows和linux下SHA1,MD5,SHA256校验办法

今天更新android studio到Android Studio Hedgehog | 2023.1.1时&#xff0c;发现提示本机安装的git版本太老&#xff0c;于是从git官网下载最新的git。 git下载地址&#xff1a; https://git-scm.com/ 从官网点击下载最新windows版本会跳转到github仓库来下载发布的git&…

一、Lamdba 表达式与函数式接口

一、Lamdba 表达式与函数式接口 1.1 Lamdba 表达式与函数式接口 1.1.1 Lambda 表达式概述 Lambda 表达式是 Java 8 引入的一个新特性Lambda 表达式可以被视为匿名函数允许在需要函数的地方以更简洁的方法定义功能Lambda 表达式可以完成简洁的函数定义Stream API 中大量使用了…

Optional的使用(代替if判断是否为空)

Optional 前言 我的使用 package yimeng;import com.ruoyi.RuoYiApplication; import com.ruoyi.common.core.domain.entity.SysUser; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.*;SpringBootTes…

常用电子器件学习——三极管

三极管介绍 三极管&#xff0c;全称应为半导体三极管&#xff0c;也称双极型晶体管、晶体三极管&#xff0c;是一种电流控制电流的半导体器件其作用是把微弱信号放大成幅度值较大的电信号&#xff0c; 也用作无触点开关。晶体三极管&#xff0c;是半导体基本元器件之一&#xf…

专业140+总分420+复旦大学957信号与系统考研经验复旦电子信息与通信

今年专业957信号与系统140&#xff0c;数二140&#xff0c;总分420&#xff0c;顺利上岸复旦大学&#xff0c;回顾这一年的复习&#xff0c;有起有落&#xff0c;也有过犹豫和放弃&#xff0c;好在都坚持下来了&#xff0c;希望大家考研复习要不忘初心&#xff0c;困难肯定是很…

explain工具优化mysql需要达到什么级别?

explain工具优化mysql需要达到什么级别&#xff1f; 一、explain工具是什么&#xff1f;二、explain查询后各字段的含义三、explain查询后type字段有哪些类型&#xff1f;四、type类型需要优化到哪个阶段&#xff1f; 一、explain工具是什么&#xff1f; explain是什么&#x…

未来已来:AI引领智能时代的多领域巨变

大家好&#xff0c;今天我们将深入探讨人工智能如何彻底改变我们的生活方式&#xff0c;领略未来的无限可能性。 1. 医疗革新&#xff1a;AI担任超级医生 医疗领域是AI最引人注目的战场之一。智能医学影像诊断系统&#xff0c;不仅能够精准识别病变&#xff0c;还能辅助医生提…

Springboot+vue的科研工作量管理系统的设计与实现(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的科研工作量管理系统的设计与实现&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的科研工作量管理系统的设计与实现…

浅谈大数据智能化技术在多个领域的应用实践

摘要 大数据智能化技术在当今信息社会中得到了广泛的应用。从金融、互联网电商、视频行业到垂直短视频领域&#xff0c;从工业互联网到云计算、边缘计算等领域&#xff0c;大数据智能化技术已经成为了企业竞争力的重要组成部分。技术实践、架构设计、指标体系、数据质量、数据分…

历经15年,比特币以强势姿态进军华尔街!270亿美元投资狂潮引发市场震荡!

本月&#xff0c;比特币庆祝了它的15岁生日&#xff0c;并以强势的姿态进军华尔街。最近美国交易所开始交易的比特币交易所交易基金&#xff08;ETF&#xff09;&#xff0c;已经获得了投资者的广泛接受。这一进展标志着比特币作为一种年轻资产迈向成熟的重要里程碑。 根据Glas…