JMQ基础知识学习

术语
说明
约束
app/应用接入JMQ的系统或应用的名称,全局唯一字母开头,字母、数字和下划线组合,控制在30个字符以内
brokerJMQ的服务端实例 
businessId/业务ID一条业务消息的ID,用于于归档查询)推荐每一条消息的businessId都唯一,方便精确查询(可以不唯一),长度须小于等于16个字符
message/消息体业务方通过JMQ传递的消息内容,在发送时客户端会对消息进行压缩

压缩之后的消息体应小于2M

queue/队列

一个topic 在一个broker上可以有一个或多个队列, 每个队列里的消息先进先出,不同队列间的消息无序

页面显示的队列数为单个broker上该主题的队列数。

每个topic默认的并发=queue*分组数量
topic/主题消息的识别串,代表一种消息类型,全局唯一字母开头,字母和数字组合,控制在20个字符以内
分组一个分组包含两个broker, 一主一从。主从节点消息完全一致,页面只展示主节点。 分组名一般为jmq*** 
连接数

客户端与broker间的TCP连接数。一个客户端会和每一个broker都建立一个连接,所以正常情况下连接数

等于客户端数量* broker数量。 在消费监控中,操作,消费详情里可以看到具体的连接信息

 

        生产者:某个消息的发送端,称为生产者

        消费者:某个消息的订阅端,称为消费者

        生产者和消费者之间是通过topic建立联系的(值得特别注意的是生产者和消费者之间的app是相互独立的,相互之间没有任何关系)

1、首先在( 测试环境( 192.168.0.0/16 ):  http://192.168.179.67/jmq-web/index.do     )进行接入申请,首先建立应用,然后在该应用下创建生产者和消费者topic, 参考文档: http://jpcloud.jd.com/pages/viewpage.action?pageId=14364351
2、JAVA客户端     
  • 不依赖于第三方组件,只和Broker通信

  • 内置管理和性能采集协议

  • 较合理的超时时间设置

  • 批量发送和消费,消费者为拉模式

  • 支持两阶段事务

  • 支持业务ID顺序消费

  • 支持机房部署,就近发送和消费

  • 默认数据压缩,更快的性能

  • 支持流量分流控制

Spring 依赖:

< dependency >
    < groupId >com.jd.jmq</ groupId >
    < artifactId >jmq-client-spring</ artifactId >
    < version >2.1.5-SNAPSHOT</ version >
</ dependency >
 
< dependency >
     < groupId >com.jd.ump</ groupId >
     < artifactId >profiler</ artifactId >
     < version >3.2.0</ version > <!-- 必须3.2.0及以上!!! -->
</ dependency >

schema配置(2.1.5-SNAPSHOT版本)


     
  1. <beans ... xmlns:jmq="http://code.jd.com/schema/jmq"
  2. xsi:schemaLocation= "...
  3. http://code.jd.com/schema/jmq
  4. http://code.jd.com/schema/jmq/jmq-1.0.xsd">
JMQ配置项:
########### test environment ##########
jmq.user=b2bAfterSale
jmq.password=69754184
jmq.address=192.168.179.50:50088

jmq.producer.app=cdzhangfang
jmq.producer.topic=cdzhangfang_topic

jmq.consumer.app=cdzhangfang
jmq.consumer.topic=cdzhangfang_topic

jmq.epoll=true生产端 Spring JMQ配置项:


  
  1. <bean id=“propertyConfigurer”
  2. class= “org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”>
  3. <property name=“locations”>
  4. <list>
  5. <value>classpath:conf/mq.properties </value>
  6. </list>
  7. </property>
  8. </bean>
  9. <jmq:transport address=" j m q . a d d r e s s &quot; &lt; / s p a n &gt; &lt; s p a n c l a s s = &quot; h l j s − a t t r &quot; &gt; u s e r &lt; / s p a n &gt; = &lt; s p a n c l a s s = &quot; h l j s − s t r i n g &quot; &gt; &quot; {jmq.address}&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;user&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot; jmq.address"</span><spanclass="hljsattr">user</span>=<spanclass="hljsstring">"{jmq.user}" password=" j m q . p a s s w o r d &quot; &lt; / s p a n &gt; &lt; s p a n c l a s s = &quot; h l j s − a t t r &quot; &gt; a p p &lt; / s p a n &gt; = &lt; s p a n c l a s s = &quot; h l j s − s t r i n g &quot; &gt; &quot; {jmq.password}&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;app&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot; jmq.password"</span><spanclass="hljsattr">app</span>=<spanclass="hljsstring">"{jmq.producer.app}"
  10. epoll= “false” channelMaxIdleTime= 10000/>
  11. <jmq:producer id=“producer” retryTimes=“3” transport=“jmq.transport”/>
transport配置说明:
属性
说明
默认值
address目录服务地址
JMQ接入地址
user 用户 查看链接用户名和密码(TOKEN信息)
password 密码 查看链接用户名和密码(TOKEN信息)

app

接入的应用(系统)代码,此属性必须填写,和user完全一样nullAPP不同的TOPIC不能共用transport
sendTimeout发送超时(毫秒)5000测试环境请适度改大
epoll是否使用epoll模式,会根据系统环境自动设置true
producer配置说明:
属性
说明
默认值
transport连接通道jmq.transport
retryTimes发送失败后的重试次数2

  • 发送代码样例(请参考 demo里的ProducerTest.java)
//获取实例
Producer producer= (Producer) context.getBean( “producer” );
 
//普通发送方式
Message message = new Message( “topic” , “消息内容” , “业务ID” );
producer.send(message, timeout);
 
//批量发送方式
List<Message> messages = new ArrayList<Message>();
for ( int j = 0 ; j < n; j++) {
     Message message = new Message( “topic” , “消息内容” , “业务ID” );
     messages.add(message);
}
 
producer.send(messages);
  • 事物发送样例
transaction
/
     * 事务的单条发送
     /
    protected void sendTransaction( int i) throws JMQException {
        Message message = new Message(topic, topic + test + i, topic + rid + i);
        Boolean ret = producer.send(message, new LocalTransaction<Boolean>() {
            @Override
            public Boolean execute() throws Exception {
                System.out.println( “execute local transaction ok!” );
                return true ;
            }
 
            @Override
            public int getTimeout() {
                return 50000 ;
            }
        });
        System.out.println( “local transaction ret value:” + ret);
    }

消费端Spring JMQ配置:

  
  1. <bean id=“propertyConfigurer”
  2. class= “org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”>
  3. <property name=“locations”>
  4. <list>
  5. <value>classpath:conf/mq.properties </value>
  6. </list>
  7. </property>
  8. </bean>
  9. <jmq:transport address=" j m q . a d d r e s s &quot; &lt; / s p a n &gt; &lt; s p a n c l a s s = &quot; h l j s − a t t r &quot; &gt; u s e r &lt; / s p a n &gt; = &lt; s p a n c l a s s = &quot; h l j s − s t r i n g &quot; &gt; &quot; {jmq.address}&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;user&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot; jmq.address"</span><spanclass="hljsattr">user</span>=<spanclass="hljsstring">"{jmq.user}" password=" j m q . p a s s w o r d &quot; &lt; / s p a n &gt; &lt; s p a n c l a s s = &quot; h l j s − a t t r &quot; &gt; a p p &lt; / s p a n &gt; = &lt; s p a n c l a s s = &quot; h l j s − s t r i n g &quot; &gt; &quot; {jmq.password}&quot;&lt;/span&gt; &lt;span class=&quot;hljs-attr&quot;&gt;app&lt;/span&gt;=&lt;span class=&quot;hljs-string&quot;&gt;&quot; jmq.password"</span><spanclass="hljsattr">app</span>=<spanclass="hljsstring">"{jmq.consumer.app}" epoll="KaTeX parse error: Expected 'EOF', got '&' at position 21: …epoll}"</span>/&̲gt;</span></div…{jmq.consumer.topic}" listener=“messageListener” maxConcurrent=“10” minConcurrent=“5”/>
  10. </jmq:consumer>
  11. <bean id=“messageListener” class=“com.jd.jmq.demo.DefaultMessageListener”/>
consumer配置说明:
属性
说明
默认值
autoStart自动启动消费true,》=1.2.25以上版本支持,高级特性谨慎设置
longPull
长轮询等待时间(一般不需要配置)5000ms
maxConcurrent
连接单组broker最大并发数,客户端实际线程数为单组运行的线程数broker数(一般不需要配置,默认等于对列数)
 topic索引分区数,管理端配置 》=1.3.1以上版本支持
minConcurrent
连接单组broker最小并发数(一般不需要配置)
0 自动调节》=1.3.1以上版本支持
pullTimeout长轮询超时时间(一般不需要配置)10000ms  pullTimeout必须大于longPull时间,否则客户端会报"请求超时"
transport连接工厂jmq.transport
属性
说明
默认值
topic消费者topic串,必须注入null
listener消息监听器是MessageListener接口的实现类所创建的对象,用于处理收到的消息
抛出异常将回滚重试消息,否则成功消费并删除消息,所以如果认为消息处理失败还需重试请抛出异常
null

 

  • 监听器模式配置样例(请参考demo里的spring-consumer.xml)
< jmq:consumer id = “consumer” transport = “jmq.transport” >
     < jmq:listener topic = "${jmq.consumer.topic}" listener = “messageListener” />
</ jmq:consumer >
 
< bean id = “messageListener” class = “com.jd.jmq.demo.DefaultMessageListener” />


监听器实现代码示例:

  
  1. /
  2. * 消息监听器.
  3. */
  4. public class DefaultMessageListener implements MessageListener {
  5. private static final Logger logger = Logger.getLogger( “consume”);
  6. /**
  7. * 消费方法。注意: 消费不成功请抛出异常,MQ会自动重试
  8. *
  9. * @param messages
  10. * @throws Exception
  11. */
  12. @Override
  13. public void onMessage(List<Message> messages) throws Exception {
  14. if (messages == null || messages.isEmpty()) {
  15. return;
  16. }
  17. for (Message message : messages) {
  18. logger.info(String.format( “收到一条消息,消息主题(队列名):%s,内容是:%s”, message.getTopic(), message.getText()));
  19. }
  20. }
  21. }






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值