文档地址

RocketMQ架构

哔哩哔哩上的视频

mq有很多,近期买了《分布式消息中间件实践》这本书,学习关于mq的相关知识。mq大致有有4个功能:

  1. 异步处理。比如业务端需要给用户发送邮件,不需要等发送完了之后才让业务端的调用代码返回。
  2. 服务解耦。服务之间调用不需要在代码上写死调用某某服务,只需要发送一个消息即可。这种发送消息的处理一般都是立即返回。类似于生成一个后台job。
  3. 流量削峰。业务系统在做活动的时候短时间内的流量会特别大,基于mq的队列的特性,可以处理这个瞬时流量过大的问题,减轻后端压力。
  4. 消息通讯。主要是订阅机制,类似聊天室。

内容介绍

低延时的分布式消息处理平台,高性能,可扩展,万亿级。由4个部分构成。name server,broker(消息代理人),producer,consumers。这4个都能水平扩展(做成集群的方式)来避免单点故障。

NameServers (集群)

NameServer是一个完整的功能性服务。主要包含以下两个方面:

  • Broker管理。接收Broker集群过来的注册消息,然后提供心跳包机制来检查Broker是否还存活。
  • 路由管理。每一个NameServer都包含关于Broker的完整路由信息,并且队列化处理客户端的查询请求。

有4种方式用于客户端指定NameServer的地址。

  1. 编程方式。类似 producer.setNamesrvAddr("ip:port")
  2. Java 配置。使用 rocketmq.namesrv.addr
  3. 环境变量。使用 NAMESRV_ADDR
  4. http 端点。

提供轻量的服务发现与路由,每一个Name Server记录完整的路由信息,提供相应的读写服务,同时支持快速存储扩展。

Broker (集群)

Broker负责消息的存储和分发,消息查询,高可用保证等。模块如下图所示。

所以,他有以下几个比较重要的子模块:

  • 远程模块。Broker的入口,用于接收客户端过来的请求。
  • 客户端管理。用于(生产者/消费者)模式的客户端管理,维护消费者对主题的订阅。
  • 存储服务。提供一些简单的api用于查询or存储物理磁盘上的消息。
  • 高可用保证服务。提供主从Broker之间的数据同步特性。
  • 索引服务。通过特定的key对消息构建索引,然后提供消息查询。

通过提供轻量级的主题队列机制来负责消息的储存。支持推拉模式,包含错误容忍机制(2或3份拷贝)。消息的顺序处理。提供容灾回复,预警机制等。

Producer (集群)

生产者提供分布式部署。分布式的生产者通过负载均衡的方式发送消息给Broker。支持快速错误反馈,并且低延迟。

Consumer (集群)

消费者也支持在推/拉模式中的分布式部署。支持集群消费+消息广播。提供实时的消息订阅机制以满足大部分需求。

如何运行(单机测试环境)

下载

安装包就好(源码也行),然后解压

wget http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.5.1/rocketmq-all-4.5.1-bin-release.zip
unzip rocketmq-all-4.5.1-bin-release.zip -d /usr/lib/rocketmq/

改一些配置

环境变量

#配置64位jdk是必须的---这里跳过
export ROCKETMQ_HOME=/usr/lib/rocketmq/rocketmq #这个不是必须,只是方便下面操作
source ~/.bash_profile #使配置生效一下
rm -f ~/logs/rocketmqlogs/*.log # 把日志清了,方便查看

启动参数

rocketmq默认的内存配置要求对我们的测试服务器要求太高了,改低一点。

vim $ROCKETMQ_HOME/bin/runserver.sh
# 把第39行改成
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g" #最小,启动,最大都是1g vim $ROCKETMQ_HOME/bin/runbroker.sh
# 把39行改成
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g" # 同上面

broker配置

vim $ROCKETMQ_HOME/conf/broker.conf
# 加这些配置
brokerIP1 = 192.168.3.20 #此broker的ip
namesvrAddr=192.168.3.20:9876 #nameServer地址,集群的话需要分号分隔。

启动NameServer

因为需要NameServer来管理Broker,所以先启动NameServer。默认的日志地址为~/logs/rocketmqlogs

nohup sh $ROCKETMQ_HOME/bin/mqnamesrv & # 以忽略挂起信号的方式启动nameserver
tail -f ~/logs/rocketmqlogs/namesrv.log # 监控的方式查看日志尾部

启动Broker

消息要通过Broker来分发,NameServer也已经启动,所以现在可以启动Broker。

nohup sh $ROCKETMQ_HOME/bin/mqbroker -c $ROCKETMQ_HOME/conf/broker.conf &
tail -f ~/logs/rocketmqlogs/broker.log

web站点查看

这里需要去下载这个,里面有个rocketmq-console。需要修改一个地方。rocketmq-externals/rocketmq-console/src/main/resources/application.properties

rocketmq.config.namesrvAddr=192.168.3.20:9876 #改成对应的namesrvAddr 地址

服务器上需要开放几个端口用于console的连接,如果没有配置,就是默认的:9876,10911,10909

firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --reload

然后就能查看了。

发送、接收消息

后续通过代码客户端的方式来实践。

关闭服务

sh $ROCKETMQ_HOME/bin/mqshutdown broker #先关了Broker
sh $ROCKETMQ_HOME/bin/mqshutdown namesrv #再关闭nameserver

[分布式学习]消息队列之rocketmq笔记的更多相关文章

  1. 多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了

    1.引言 对于即时通讯网来说,所有的技术文章和资料都在围绕即时通讯这个技术方向进行整理和分享,这一次也不例外.对于即时通讯系统(包括IM.消息推送系统等)来说,MQ消息中件间是非常常见的基础软件,但市 ...

  2. Java分布式:消息队列(Message Queue)

    Java分布式:消息队列(Message Queue) 引入消息队列 消息,是服务间通信的一种数据单位,消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.队列,是一种常见的数据结 ...

  3. 消息队列之-RocketMQ入门

    简介 RocketMQ是阿里开源的消息中间件,目前已经捐献个Apache基金会,它是由Java语言开发的,具备高吞吐量.高可用性.适合大规模分布式系统应用等特点,经历过双11的洗礼,实力不容小觑. 官 ...

  4. Android开发学习—— 消息队列

    ###主线程不能被阻塞* 在Android中,主线程被阻塞会导致应用不能刷新ui界面,不能响应用户操作,用户体验将非常差* 主线程阻塞时间过长,系统会抛出ANR异常* ANR:Application ...

  5. java学习-消息队列rabbitmq的组成

    rabbitMQ组成部分 rabbitmq有以下组成部分,分别为: 1. Server(broker)接受客户端连接,实现AMQP消息队列和路由功能的进程 2.虚拟主机virtual host虚拟主机 ...

  6. 消息队列开发记录笔记-ActiveMQ

    1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip,然后双击a ...

  7. kafka——分布式的消息队列系统

    总听公司人说kafka kafka... 所以这玩意到底是个啥? 好像是一个高级版的消息队列,什么高吞吐量,数据持久,消息均衡,emmm https://blog.csdn.net/nawenqian ...

  8. 消息队列之--RocketMQ

    序言 资料 https://github.com/alibaba/RocketMQ http://rocketmq.apache.org/

  9. 消息队列中间件 RocketMQ 源码分析 —— Message 存储

随机推荐

  1. 【STM32H7教程】第29章 STM32H7的USART串口基础知识和HAL库API

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第29章       STM32H7的USART串口基础知识和 ...

  2. 关于unittest单元测试框架中常用的几种用例加载方法

    unittest模块是Python自带的一个单元测试模块,我们可以用来做单元测试.unittest模块包含了如下几个子模块: 测试用例:TestCase 测试集:TestSuite 加载用例:Test ...

  3. Java报错:java.math.BigDecimal cannot be cast to java.lang.String

    从数据库取数字,转为string,报错: java.math.BigDecimal cannot be cast to java.lang.String 错误代码 Integer.parseInt(( ...

  4. docker安装完报错:Failed to start docker.service: Unit docker.service is masked

    执行 systemctl start docker 报错 Failed to start docker.service: Unit docker.service is masked. 解决 syste ...

  5. Web前端——Html常用标签及属性

    html 常用的标题等标签就不记录了,只记录一下比较少见的标签以及属性 表格 table td 单元格 tr 表的行 th 表头 td或th可以下面的两个属性达到跨行或跨列 表格跨行 rowspan ...

  6. Ubuntu桌面版安装小记

    之前一直是用Ubuntu的桌面版装docker,桌面版本身用起来比较方便,但开销较大,如果建立多个虚拟机就比较费劲了.今天试了一下server版的Ubuntu,发现还是比较方便的,相比桌面版,有如下好 ...

  7. C#上手练习7(方法语句2)

    上一篇方法调用赋值封装,这里使用封装后调用,尽量满足开闭原则. 以及静态类的使用. using System; namespace KingTest03 { class Program { int a ...

  8. C#用Call代替CallVirt之后的测试用例

    一. C# 原始代码和直接结果 测试 C# 代码: class Program { static void Main(string[] args) { A c1 = new C(); c1.Foo() ...

  9. Flask 教程 第四章:数据库

    本文翻译自 The Flask Mega-Tutorial Part IV: Database 在Flask Mega-Tutorial系列的第四部分,我将告诉你如何使用数据库. 本章的主题是重中之重 ...

  10. RPA之AA

    RoboticProcessAutomation(即机器人流程自动化),RPA机器人能够模仿大多数人类用户的行为, 比如可以登录应用程序,移动文件和文件夹,复制和粘贴数据,填写表单,从文档中提取结构化 ...