RocketMQ 常用API

消息

消息消费模式

消息消费模式由消费者来决定,可以由消费者设置MessageModel来决定消息模式。

消息模式默认为集群消费模式

 consumer.setMessageModel(MessageModel.BROADCASTING);
consumer.setMessageModel(MessageModel.CLUSTERING);

集群消息

集群消息是指集群化部署消费者

当使用集群消费模式时,MQ 认为任意一条消息只需要被集群内的任意一个消费者处理即可。

特点

  • 每条消息只需要被处理一次,broker只会把消息发送给消费集群中的一个消费者
  • 在消息重投时,不能保证路由到同一台机器上
  • 消费状态由broker维护

广播消息

当使用广播消费模式时,MQ 会将每条消息推送给集群内所有注册过的客户端,保证消息至少被每台机器消费一次。

特点

  • 消费进度由consumer维护

  • 保证每个消费者消费一次消息

  • 消费失败的消息不会重投

发送方式

同步消息

消息发送中进入同步等待状态,可以保证消息投递一定到达

异步消息

想要快速发送消息,又不想丢失的时候可以使用异步消息

         producer.send(message,new SendCallback() {

			public void onSuccess(SendResult sendResult) {
// TODO Auto-generated method stub
System.out.println("ok");
} public void onException(Throwable e) {
// TODO Auto-generated method stub
e.printStackTrace();
System.out.println("err");
}
});

单向消息

只发送消息,不等待服务器响应,只发送请求不等待应答。此方式发送消息的过程耗时非常短,一般在微秒级别。

 producer.sendOneway(message);

批量消息发送

可以多条消息打包一起发送,减少网络传输次数提高效率。

producer.send(Collection c) 方法可以接受一个集合 实现批量发送

 public SendResult send(
Collection<Message> msgs) throws MQClientException, RemotingException, MQBrokerException, InterruptedException {
return this.defaultMQProducerImpl.send(batch(msgs));
}
  • 批量消息要求必要具有同一topic、相同消息配置
  • 不支持延时消息
  • 建议一个批量消息最好不要超过1MB大小
  • 如果不确定是否超过限制,可以手动计算大小分批发送

TAG

可以使用tag来过滤消费

在Producer中使用Tag:

Message msg = new Message("TopicTest","TagA" ,("Hello RocketMQ " ).getBytes(RemotingHelper.DEFAULT_CHARSET));

在Consumer中订阅Tag:

consumer.subscribe("TopicTest", "TagA||TagB");// * 代表订阅Topic下的所有消息

SQL表达式过滤

消费者将收到包含TAGA或TAGB或TAGB的消息. 但限制是一条消息只能有一个标签,而这对于复杂的情况可能无效。 在这种情况下,您可以使用SQL表达式筛选出消息.

配置

broker.conf 中添加配置

enablePropertyFilter=true

启动broker 加载指定配置文件

../bin/mqbroker -n 192.168.150.113:9876 -c broker.conf

随后在集群配置中可以看到

实例

        MessageSelector selector = MessageSelector.bySql("order > 5");
consumer.subscribe("xxoo3", selector);

语法

RocketMQ只定义了一些基本的语法来支持这个功能。 你也可以很容易地扩展它.

  1. 数字比较, 像 >, >=, <, <=, BETWEEN, =;
  2. 字符比较, 像 =, <>, IN;
  3. IS NULL 或者 IS NOT NULL;
  4. 逻辑运算AND, OR, NOT;

常量类型是:

  1. 数字, 像123, 3.1415;
  2. 字符串, 像‘abc’,必须使用单引号;
  3. NULL, 特殊常数;
  4. 布尔常量, TRUEFALSE;

延迟消息

RocketMQ使用messageDelayLevel可以设置延迟投递

默认配置为

messageDelayLevel	1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

配置

broker.conf 中添加配置

messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

这个配置项配置了从1级开始,各级延时的时间,可以修改这个指定级别的延时时间;

时间单位支持:s、m、h、d,分别表示秒、分、时、天;

使用

发送消息时设置

message.setDelayTimeLevel(1);

顺序消费

队列先天支持FIFO模型,单一生产和消费者下只要保证使用MessageListenerOrderly监听器即可

顺序消费表示消息消费的顺序同生产者为每个消息队列发送的顺序一致,所以如果正在处理全局顺序是强制性的场景,需要确保使用的主题只有一个消息队列。

并行消费不再保证消息顺序,消费的最大并行数量受每个消费者客户端指定的线程池限制。

那么只要顺序的发送,再保证一个线程只去消费一个队列上的消息,那么他就是有序的。

跟普通消息相比,顺序消息的使用需要在producer的send()方法中添加MessageQueueSelector接口的实现类,并重写select选择使用的队列,因为顺序消息局部顺序,需要将所有消息指定发送到同一队列中。

保证有序参与因素

  • FIFO
  • 队列内保证有序
  • 消费线程

重试机制

producer

默认超时时间

    /**
* Timeout for sending messages.
*/
private int sendMsgTimeout = 3000;
	// 异步发送时 重试次数,默认 2
producer.setRetryTimesWhenSendAsyncFailed(1);
// 同步发送时 重试次数,默认 2
producer.setRetryTimesWhenSendFailed(1); // 是否向其他broker发送请求 默认false
producer.setRetryAnotherBrokerWhenNotStoreOK(true);

Consumer

消费超时,单位分钟

consumer.setConsumeTimeout()

发送ack,消费失败

RECONSUME_LATER

broker投递

只有在消息模式为MessageModel.CLUSTERING集群模式时,Broker才会自动进行重试,广播消息不重试

重投使用messageDelayLevel

默认值

messageDelayLevel	1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

事务消息

分布式系统中的事务可以使用TCC(Try、Confirm、Cancel)、2pc来解决分布式系统中的消息原子性

RocketMQ 4.3+提供分布事务功能,通过 RocketMQ 事务消息能达到分布式事务的最终一致

RocketMQ实现方式

Half Message:预处理消息,当broker收到此类消息后,会存储到RMQ_SYS_TRANS_HALF_TOPIC的消息消费队列中

检查事务状态:Broker会开启一个定时任务,消费RMQ_SYS_TRANS_HALF_TOPIC队列中的消息,每次执行任务会向消息发送者确认事务执行状态(提交、回滚、未知),如果是未知,等待下一次回调。

超时:如果超过回查次数,默认回滚消息

TransactionListener的两个方法

executeLocalTransaction

半消息发送成功触发此方法来执行本地事务

checkLocalTransaction

broker将发送检查消息来检查事务状态,并将调用此方法来获取本地事务状态

本地事务执行状态

LocalTransactionState.COMMIT_MESSAGE

执行事务成功,确认提交

LocalTransactionState.ROLLBACK_MESSAGE

回滚消息,broker端会删除半消息

LocalTransactionState.UNKNOW

暂时为未知状态,等待broker回查

RocketMQ 简单运维

MQAdmin

创建Topic updateTopic

./mqadmin updateTopic -b localhost:10911 -t TopicCmd

删除Topic deleteTopic

./mqadmin deleteTopic -n localhost:9876 -c localhost:10911 -t TopicCmd

Topic列表 topicList

./mqadmin topicList -n localhost:9876

Topic信息 topicStatus

./mqadmin topicStatus -n localhost:9876 -t xxoo3

Topic 路由信息 topicRoute

./mqadmin topicRoute -n localhost:9876 -t xxoo3

Broker状态信息 brokerStatus

./mqadmin brokerStatus -n localhost:9876 -b localhost:10911

Broker配置信息 brokerStatus

./mqadmin getBrokerConfig -n localhost:9876 -b localhost:10911

性能测试

./mqadmin sendMsgStatus -n localhost:9876 -b broker-a -c 10

后台启动服务

nohup ./mqnamesrv >./log.txt  2>&1 &

nohup

ssh连接中,运行这条指令,你会发现进程中有了demo.jar 这条进程,但它并不在后台运行这时你无法在当前ssh连接中进行其他命令,因为它不是后台运行,你ctrl+c,这条进程会消失。

nohup 并不会后台运行,它是忽略内部的挂断信号,不挂断运行

&

程序会在后台运行,如果直接关闭窗口,进程任然会被关闭

>./log.txt

表示把控制台的日志输出到指定文件中

2>&1

0表示标准输入
1表示标准输出
2表示标准错误输出
> 默认为标准输出重定向,与 1> 相同
2>&1 意思是把 标准错误输出 重定向到 标准输出.
&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中

终止进程中的kill命令

1  SIGHUP 挂起进程

2  SIGINT 终止进程

3  SIGGQUIT 停止进程

9  SIGKILL 无条件终止进程

15  SIGTERM 尽可能终止进程

17  SIGSTOP 无条件停止进程,但不是终止

18  SIGTSTP 停止或者暂停进程,但不终止进程

19  SIGCONT 继续运行停止的进程

Rocket Mq 常用API 及简单运维的更多相关文章

  1. 老司机实战Windows Server Docker:3 单节点Windows Docker服务器简单运维(上)

    经过上两篇实战Windows Server Docker系列文章,大家对安装Windows Docker服务以及如何打包现有IIS应用为docker镜像已经有了基本认识.接下来我们来简单讲讲一些最基本 ...

  2. 老司机实战Windows Server Docker:4 单节点Windows Docker服务器简单运维(下)

    上篇中,我们主要介绍了使用docker-compose对Windows Docker单服务器进行远程管理,编译和部署镜像,并且设置容器的自动启动.但是,还有一些重要的问题没有解决,这些问题不解决,就完 ...

  3. PHP程序员的简单运维

    所谓的简单运维就是保证自己开发的程序能正常运行和使用. 当一个程序员需要兼作运维时候需要掌握以下技能 1.linux系统基础命令和Windows Server操作 是基础中的基础,ls, rm, to ...

  4. 工作中常用Linux命令--服务器运维

    工作中常用Linux命令--服务器运维 lsof查看端口使用情况 lsof -i:8080更多lsof命令使用说明:http://www.cnblogs.com/peida/archive/2013/ ...

  5. shell 脚本实战笔记(11)--Mysql在linux下的安装和简单运维

    前言: linux中安装mysql以及配置的管理, 基础的运维和管理还是需要会一些的. 这边作下笔记, 以求天天向上(^_^). 安装流程:*). 安装mysql-server1). 借助yum检索相 ...

  6. InfluxDB系列之一安装及简单运维(未完成,需要继续写)

    InfluxDB 是一个开源分布式时序.事件和指标数据库.使用 Go 语言编写,无需外部依赖.其设计目标是实现分布式和水平伸缩扩展. 它有三大特性: 1. Time Series (时间序列):你可以 ...

  7. kafka中常用API的简单JAVA代码

    通过之前<kafka分布式消息队列介绍以及集群安装>的介绍,对kafka有了初步的了解.本文主要讲述java代码中常用的操作. 准备:增加kafka依赖 <dependency> ...

  8. nginx常用运维日志分析命令

    nginx常用日志分析命令 运维人员必备 常用日志分析命令 1.总请求数 wc -l access.log |awk '{print $1}' 2.独立IP数 awk '{print $1}' acc ...

  9. PopupWindow 的常用api封装

    对PopupWindow常用API的简单封装,几行代码就搞定PopupWindow弹窗,使用Builder模式,链式调用,像使用AlertDialog 一样 封装通用PopupWindow,Custo ...

随机推荐

  1. weblogic12c安装笔记

    weblogic12c安装笔记 1.创建wls用户 useradd wls 2.切换到wls用户 su - wls 3.在/home/wls/创建files.jdk1.8.patch.bao目录 mk ...

  2. BigDecimalAvoidDoubleConstructorRule:不要直接用double变量作为构造BigDecimal的参数

    先上结论: 不要直接用double变量作为构造BigDecimal的参数. 线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3. 2,解析JSON并把这个数字保存在一 ...

  3. 02.Oracle之安装与配置

    1.Oracle简介 Oracle是世界上最早的商品化的关系型数据库管理系统,是数据库专业厂商ORACLE(中文名字叫甲骨文)公司开发的,也是当前应用最为广泛.功能最强大.具有面向对象特点.采用了客户 ...

  4. 给博客加入链接安全跳转页(添加一个和CSDN一样的链接跳转页)

    本文首发于青云工作室 原文链接为 https://qystudio.ltd/posts/25250.html 前言 或是出于优化 SEO,或是出于加强网站体验,很多博客都给文章中的外部链接加上了个二次 ...

  5. 探秘inter()方法

    最近在阅读<深入理解Jav虚拟机>的运行时常量池章节,看到"java语言并不要求常量池一定只有编译器才能产生...运行期间也可以将新的常量放入常量池,这种特性被开发人员利用得比较 ...

  6. Smartbi研究院分享:数据仓库的五大特点

    ​我先给大家举个例子,首先数据仓库,从字面上理解就可以感受到这是一个很大的空间,而且存储的物品很杂,里面会存放酱油.沐浴露.洗发精等物品,而数据库是存放酱油.盐等厨房用品,洗浴又是一个数据库.另外一个 ...

  7. Oracle之查询排序

    SQL排序查询 DESC降序.ASC升序(默认是升序) /* 语法结构: SELECT * | 列名1[,列名2...] | 表达式 FROM 表名 [WHERE 限定条件] ORDER BY 列名1 ...

  8. python浅拷贝与深拷贝浅析

    首先我们要明确,python中大多数都是浅拷贝,我们先说原因: 1.时间花费更少 2.内存更小 3.效率更高,浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高. 容器(如列表)切片是浅拷贝

  9. Tableau绘制K线图、布林线、圆环图、雷达图

    Tableau绘制K线图.布林线.圆环图.雷达图 本文首发于博客冰山一树Sankey,去博客浏览效果更好.直接右上角搜索该标题即可 一. K线图 1.1 导入数据源 1.2 拖拽字段 将[日期]托到列 ...

  10. SQL Server的Linked Servers(链接)

    我们在使用SQL Server时,有时会有这种需求,需要从一个SQL Server服务器A中,查询另一个SQL Server服务器B中的表,然后将SQL Server服务器A中的表和SQL Serve ...