https://www.jianshu.com/p/4a275e779afa
vi /usr/local/rocketmq/bin/runbroker.sh
需要根据内存大小进行适当的对JVM参数进行调整:
```
JAVAOPT="${JAVAOPT} -server -Xms256m -Xmx256m -Xmn128m" ```
```
set "JAVAOPT=%${JAVAOPT}% -Drocketmq.broker.diskSpaceWarningLevelRatio=1.0" ```
vim /usr/local/rocketmq/bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
broker-a.properties
使用这个配置文件存储目录在bin目录下的store
```
brokerClusterName=rocketmq-cluster
brokerName=broker-a
brokerId=0
namesrvAddr=127.0.0.1:9876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10911
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=100000
mapedFileSizeConsumeQueue=300000
diskMaxUsedSpaceRatio=100
storePathRootDir=D:\store
storePathCommitLog=D:\store\commitlog
storePathConsumeQueue=D:\store\consumequeue
storePathIndex=D:\store\index
storeCheckpoint=D:\store\checkpoint
abortFile=D:\store\abort
maxMessageSize=65536
```
在当前目录下rocketmq-all-4.3.0-bin-release下执行以下命令
start mqnamesrv.cmd
start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true 测试使用这个命令 指定配置文件启动 start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true -c broker-a.properties
在runborker.cmd增加以下配置:意思是磁盘的使用空间达到百分之99才会做拒绝写入并预警
set "JAVA_OPT=%JAVA_OPT% -Drocketmq.broker.diskSpaceWarningLevelRatio=0.99"
注意是使用cmd 窗口打开
```
mqadmin updateTopic -b localhost:10911 -t tyrant
./mqadmin updateTopic -b localhost:10911 -t tyrant ```
https://blog.csdn.net/fenglibing/article/details/92378090
消息队列是一种“先进先出”的数据结构
其应用场景主要包含以下3个方面
系统的耦合性越高,容错性就越低。
一次性调用3个接口,如果一个接口有异常,则本次请求就异常了。
3个接口有一个失败了其余2个应该回滚或者失败的这个要做补偿。
以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。
使用消息队列解耦合,系统的耦合性就会提高了。
比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。
当物流系统回复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。
应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮。有了消息队列可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提到系统的稳定性和用户体验。
一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样总不能下单体验要好。
为了业务数据直接打到数据库我把数据先存在Mq,然后消费端每次insert到数据库再通过定时器拉取这样可以吗?
处于经济考量目的:
业务系统正常时段的QPS如果是1000,流量最高峰是10000,为了应对流量高峰配置高性能的服务器显然不划算,这时可以使用消息队列对峰值流量削峰
原来是需要A系统分别调用B C D 系统。现在如果新增E那么需要修改代码,需要在A系统调用E系统
通过消息队列可以让数据在多个系统更加之间进行流通。数据的产生方不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方直接在消息队列中直接获取数据即可
不需要同步执行的远程调用可以有效提高响应时间
```md 1.解耦:系统耦合度降低,没有强依赖关系
2.异步:不需要同步执行的远程调用可以有效提高响应时间
3.削峰:请求达到峰值后,后端service还可以保持固定消费速率消费,不会被压垮
4.数据分发:通过消息队列可以让数据在多个系统更加之间进行流通。数据的产生方不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方直接在消息队列中直接获取数据即可 ```
优点:解耦、削峰、数据分发
缺点包含以下几点:
系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。
如何保证MQ的高可用?
MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。
如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?
A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。
如何保证消息数据处理的一致性?
重试 + 幂等
常见的MQ产品包括Kafka、ActiveMQ、RabbitMQ、RocketMQ。
RabbitMQ 对消息堆积的支持并不好,在它的设计理念里面,消息队列是一个管道,大量的消息积压是一种不正常的情况,应当尽量去避免。
当大量消息积压的时候,会导致 RabbitMQ 的性能急剧下降。
RabbitMQ 的性能是我们介绍的这几个消息队列中最差的,根据官方给出的测试数据综合我们日常使用的经验,依据硬件配置的不同,它大概每秒钟可以处理几万到十几万条消息。
RabbitMQ 使用的编程语言 Erlang,这个编程语言不仅是非常小众的语言,如果你想基于 RabbitMQ 做一些扩展和二次开发什么的,建议你慎重考虑一下可持续维护的问题。
rabbitMq有两种集群模式:1、一台存全部数据,另外几台存元数据(数据存储服务器ip)2、所有服务器存储全部数据。rabbitmq不分主从,所有节点都是等价的。造成的问题是所有服务器存储全部数据对服务器磁盘有压力。
rabbitmq只是集群高可用 没有分布式存储,因为集群中每台机器存储的数据量是一样的只能垂直的扩展没能水平扩展,kafka和rocketmq都是讲消费拆分后存储到不同的消息然后每个消息对应一个主节点 其他机器存储副本
RocketMQ 对在线业务的响应时延做了很多的优化,大多数情况下可以做到毫秒级的响应,如果你的应用场景很在意响应时延,那应该选择使用 RocketMQ。
RocketMQ 的性能比 RabbitMQ 要高一个数量级,每秒钟大概能处理几十万条消息。
RocketMQ 有非常活跃的中文社区,大多数问题你都可以找到中文的答案,也许会成为你 选择它的一个原因。
另外,RocketMQ 使用 Java 语言开发,它的贡献者大多数都是中国 人,源代码相对也比较容易读懂,你很容易对 RocketMQ 进行扩展或者二次开发。
Kafka 与周边生态系统的兼容性是最好的没有之一,尤其在大数据和流计算领域,几乎所 有的相关开源软件系统都会优先支持Kafka。
Kafka 使用 Scala 和 Java 语言开发,设计上大量使用了批量和异步的思想,这种设计使得 Kafka 能做到超高的性能。
Kafka 的性能,尤其是异步收发的性能,是三者中最好的,但与 RocketMQ 并没有量级上的差异,大约每秒钟可以处理几十万条消息。
我曾经使用配置比较好的服务器对 Kafka 进行过压测,在有足够的客户端并发进行异步批 量发送,并且开启压缩的情况下,Kafka 的极限处理能力可以超过每秒 2000 万条消息。
但是 Kafka 这种异步批量的设计带来的问题是,它的同步收发消息的响应时延比较高,因 为当客户端发送一条消息的时候,Kafka 并不会立即发送出去,而是要等一会儿攒一批再发 送,在它的 Broker 中,很多地方都会使用这种“先攒一波再一起处理”的设计。
当你的业务场景中,每秒钟消息数量没有那么多的时候,Kafka的时延反而会比较高。所以,Kafka 不太适合在线业务场景。 主要用于日志传输大数据等方面