`

JMS实践

    博客分类:
  • J2EE
阅读更多

本文中只是把我的一些使用JMS的心得写出来,并非什么"最佳实践",有错误的请大家尽管拍砖!

1.消息类型的选择
Java的JMS消息类型有文本类型,对象类型,字节类型,流类型,XML类型,在实际项目中,用的最多的是文本类型,对象类型和xml类型的消息.建议最好不用对象类型,因为如果用对象类型的话,调试的时候是很麻烦的,首先你必须要写专门的测试代码用来发送消息,第二,必须要管理对象所属的类的不同版本,第三,不方便查看queue或者topic中的消息内容.而如果使用文本类型或者xml类型的消息,那么可以很容易的通过JMS中间件提供的一些管理工具来发送测试消息,查看消息内容,并且更加容易管理不同版本之间的兼容性.如果一定要用对象类型消息的话,建议使用xstream把对象转化为xml

2.是使用queue还是topic?
这两者的定义是很清楚的,也很容易区分.但是在实际项目中,如何来取舍呢?我的建议是尽量用queue.如果你的项目用到了JMS,那么你的系统也应该是到了需要部署在集群环境的规模了.用topic在集群环境下会带来很多麻烦.举个简单的例子,如果你是用MDB来处理topic的消息,你有一个MDB名为SampleMDB,它以集群的方式分别部署在A服务器和B服务器上.那么有可能同一条topic消息被同一个MDB处理两次.虽然一些JMS中间件提供商为解决这种问题提供了一些解决方案,例如把subsriber分组,但是它为开发和调试都带来了很大的麻烦.topic消息的处理也要比queue的复杂,很难跟踪topic消息的处理过程.
那么,如果不用topic的话,怎么来实现topic这种性质的消息处理呢?可以写一个消息转发器,把一个queue上的消息转发给所有关注这个queue的其它queue中.例如,有一个queue,名为SampleQ1,一个消息发送者sender,一个消息转发器router,有三个handler A,B,C需要处理这个queue中的消息.那么,sender发送消息到SampleQ1,router接收SampleQ1的消息后分别发送到SampleQ1_A,SampleQ1_B,SampleQ1_C,handler A,B,C分别从队列SampleQ1_A,SampleQ1_B,SampleQ1_C中接收消息.

3.用JMS来解决什么问题?
一提起JMS可以做什么,第一想到的就是异步处理.面试的时候问JMS可以做什么?大多数的回答是:用JMS来异步发送邮件!(到底应该怎么样构建一个邮件发送系统不是本文的主题,以后有时间我会专门来谈谈在我的项目中,我是怎么来设计邮件发送系统的).其实,还可以用JMS来解决很多复杂的问题,例如分布,并发,系统解耦,负载均衡,热部署,触发器等等,这些复杂的问题因为引入了JMS而变的更加简单.下面简单介绍下解决分布,并发问题的场景.
3.1 用JMS来解决并发问题
queue的概念大家都很清楚了,那就是queue里的一条消息只会被一个消息接收者处理.基于这个概念,我们可以在系统中对并发要求很严格的模块中引入JMS的使用.例如,系统的送积分,一般这个模块是用一个定时器,例如quartz,每天定期查询数据库,如果发现有满足条件的记录,那么就把积分送给会员.如果同时有多个quartz在运行,那么必须严格控制防止并发的对同一条记录送多次积分.解决这个问题有很多方法,可以通过业务的设计,系统的部署,数据库的设计,事务的控制等方法来实现,在这里提一个用JMS来解决问题的方法:在插入记录的同时发送一个queue的消息.这样即使有多个送积分的MDB实例在运行,也只会被一个实例处理.

3.2用JMS来解决分布的问题
解决分布有两种类型,第一种是指消息是集中的,但消息的处理是分布的.例如,系统可能会被分为前台与后台,这两个系统是部署在不同的网段里的.那么怎么把前台发生的业务通知后台系统呢?当然,可以通过一个类似定时器的玩意定期去数据库查询.但这种方式要么就是浪费系统资源,可能在定期查询中80%的时间都是在做无用功,要么就是业务请求没有被及时处理.,因为定期的时间总是有一个时间间隔的.用JMS来处理这个问题会怎么样呢?前台系统在处理完业务请求后的同时发送一个消息到queue中,后台系统的消息接收者接收到消息后立即处理.这里消息的处理也可能有一定的延期,但这主要取决于消息服务器的硬件能力,网络带宽,消息接收者的处理速度等.

第二中是指消息也是分布的.很多消息中间件都提供了消息路由的功能,即消息发送到一个消息服务器后,这个消息服务器根据定义的规则再把这条消息路由转发到其它的消息服务器.例如,可能在北京的一个数据中心部署了数据采集系统,采集到数据后以消息的方式发送到消息服务器,然后消息服务器再把这条消息路由到上海的数据中心,再由上海数据中心部署的数据处理系统来处理这条消息.

4.JMS与事务,一定要用JTA事务吗
很多人接触到JTA事务都是从用JMS开始的,毕竟同时要连多个数据库的的系统并不是那么的多!而要用JTA事务的话,就得要在笨重的应用服务器中部署.(当然,你也可以用类似atomikos的轻量级JTA事务管理器),更重要的是,并不是事务本身的技术有多复杂,而是事务的界定,这种事务的界定有时都不是程序员能决定的事情,需要在设计的时候就要考虑清楚,甚至可能还需要业务人员的参与.(题外话:经常问面试的,用spring的aop做什么?大多数答:用来管理事务!事务要真这么简单该多好啊!)
我也不是要反对用JTA事务,而是要说明一下,用JMS,并非一定要用JTA事务.这可以分为三种场景:
一,必须用JTA事务,这种情况下,一般消息的接收者只从消息本身获得数据并进行处理.所以必须要保证消息的发送与所依赖的业务保持一致.
二.不需要用事务,这种情况下, 要么是业务无关紧要,例如用JMS来记录日志.要么是发送的消息仅仅是一个作为后续业务处理的一个触发器!消息接收者仅仅是从消息中获得一个id,然后根据这个id去查询所依赖的其它数据进行业务处理.即使消息丢失也没关系,可以通过其它的机制来补偿.
三.消息丢失可以通过补偿事务来完成.这个依赖与具体实现,就不详细说了.

5.处理消息永远比发送消息慢!
要保证你的JMS应用稳定的运行,那么你必须在开发,部署的时候时刻重视这个问题.
首先,需要把发送消息的连接池与接收消息的连接池分开.以避免接收消息的连接过过而导致发送消息的应用拿不到连接.
在一个连接上并发的处理消息,而不是连接打开,处理一个消息,马上关闭连接.
合理的设置消息的过期时间,否则消息日积月累,最终超出queue的size
对于非关键业务的消息处理,可以采用异步处理的方法:接收到消息后并不是立刻处理,而是放到一个任务池或者线程池中处理.如果消息处理失败,则把消息重新发送回队列中.

分享到:
评论

相关推荐

    JMS消息服务详解

    什么是消息服务 为什么使用消息服务 什么是JMS(Java Message Service) JMS的通信方式 JMS应用程序开发步骤 JMS应用程序开发实践 其他的JMS特性

    SpringBoot JMS(ActiveMQ) 使用实践.docx

    注意: @JmsListener是一个可重复的注解,在java7及以下版本jdk中,可以使用@JmsListeners代替它。

    Java理论与实践: 应该在下一个企业应用程序中使用JMS吗?

    本文介绍了使用MQ技术经常可以改善应用程序的组织、性能和可伸缩性以及Java消息服务是集成到J2EE中的一部分,它使得消息排队(MQ)服务可以为任何J2EE应用程序所用。MQ工具没有数据库工具为人所知或为人理解,数据库...

    分布式事务实践 解决数据一致性

    1-1 导学-分布式事务实践 第2章 事务原则与实现 介绍了事务的四大原则,并通过实例介绍数据库实现事务的方法,以及使用JDBC实现事务的方法。 2-1 事务原则与实现:事务 2-2 事务原则与实现:SQL事务 2-3 事务原则与...

    jms-spring3-ibmmq:JMS 1.0.2 与 Spring 3.2.x 和 IBM MQ

    带有 JMS 1.0.2 和 Spring 3.2.x 的 IBM MQ 使用 IBM MQ 和 Spring 3.2.x 的 JMS 1.0.2 示例配置

    ActiveMQ实践入门指南

    ActiveMQ 是一个完全支持JMS1.1和 J2EE 1.4 规范的 JMS Provider 实现,尽管JMS 规范出台已经是很久的事情了,但是JMS在当今的 J2EE应用中间仍然扮演着特殊的地位。下面我们将分四部分来介绍ActiveMQ 的相关内容。

    BEA WebLogic Server8.1大全 源码

    本书全面介绍了WebLogic在J2EE应用程序的各个方面所完成的任务:从使用servlet、JSP和EJB,到管理分布式系统,包括利用JTA的事务处理、利用JNDI的目录服务、利用JMS的消息系统,等等。本书作者还特别注意WebLogic中...

    JMS打字高手

    如指法训练的手形演示,对帮助初学者尽快掌握指法及规范指法非常有用,五笔教学的字根拆解,它为每一个爱好五笔的人提供一个极好的学习环境,让五笔练习成为一种看得见、摸得着的实践活动,帮助您在极短的时间内掌握...

    [Liferay] Liferay Portal 性能调优最佳实践 (英文版)

    [Packt Publishing] Liferay Portal 性能调优最佳实践 (英文版) [Packt Publishing] Liferay Portal Performance Best Practices (E-Book) ☆ 出版信息:☆ [作者信息] Samir Bhatt [出版机构] Packt Publishing...

    J2EE核心模式(第二版中英文双语版).zip

    本书关注的主要内容,是使用J2EE的核心技术(包括JSP、servlet、EJB、JMS API等)实现企业应用过程中的模式、最佳实践、设计策略以及经过验证的解决方案。其中的J2EE模式目录包括21个模式以及大量策略,有助于记录、...

    JMeter 高级实践使用手册

    1.Jmeter 基础入门 2、创建一个网站测试计划 3、添加默认 HTTP 请求属性 4、取样器详细讲解 5、监听器系统讲解 6、高级 web性能 测试计划 7、数据库性能测试 8、 FTP 性能测试 9、 JMS 点对点测试计划 10、性能调优

    Pulsar Summit Asia 2021(PPT汇总),共17份.zip

    Pulsar Summit Asia 2021(PPT汇总),共包含以下17份文档: Apache InLong 借助 Pulsar 打造一站式数据集成平台.pptx ...Using Apache Pulsar as a Modern, Scalable, High Performing JMS Pla 等等文件

    poc_jms_mq_umlauts:解决MQ消息编码问题的样本项目

    poc_jms_mq_umlauts 解决MQ消息编码问题的样本项目

    大型分布式网站架构与实践

     2.3.1 ActiveMQ & JMS 96  2.4 垂直化搜索引擎 104  2.4.1 Lucene简介 105  2.4.2 Lucene的使用 108  2.4.3 Solr 119  2.5 其他基础设施 125  第3章 互联网安全架构 126  本章主要介绍和解决如下问题:  ...

    收入了164个完整的、来自实战的Java编程实例,每个例子都有详尽的注释,全新的第二版涵盖了Java v1.3,实现了20个不同的Java API,其中包括Servelt、JSP、XML、Swing和Java2D

    java 网络高级编程(PDF) 介绍了网络进程通信的主要技术,Java有关的Web技术,异步消息服务技术JMS和Java Mail技术,Java安全体系结构、密钥、消息摘要、数字签名等技术 Java 极限编程(PDG) 简短介绍极限编程文法及...

    J2EE专业项目实例开发(3)

    本书是学习J2EE编程的优秀参考书,主要包括以下内容:第一部分概述了有关J2EE编程的重要概念,如applet的创建、... 本书既有完整的概念说明,又有复杂而完整的实例代码,读者能够轻松地将自己所学的理论知识付诸实践

    J2EE专业项目实例开发(1)

    本书是学习J2EE编程的优秀参考书,主要包括以下内容:第一部分概述了有关J2EE编程的重要概念,如applet的创建、... 本书既有完整的概念说明,又有复杂而完整的实例代码,读者能够轻松地将自己所学的理论知识付诸实践

    J2EE专业项目实例开发(4)

    本书是学习J2EE编程的优秀参考书,主要包括以下内容:第一部分概述了有关J2EE编程的重要概念,如applet的创建、... 本书既有完整的概念说明,又有复杂而完整的实例代码,读者能够轻松地将自己所学的理论知识付诸实践

    J2EE专业项目实例开发(2)

    本书是学习J2EE编程的优秀参考书,主要包括以下内容:第一部分概述了有关J2EE编程的重要概念,如applet的创建、... 本书既有完整的概念说明,又有复杂而完整的实例代码,读者能够轻松地将自己所学的理论知识付诸实践

Global site tag (gtag.js) - Google Analytics