[关闭]
@iamfox 2015-12-10T16:58:05.000000Z 字数 1508 阅读 3643

阿里云ONS消息队列使用

汇银



基本原理

阿里云ONS提供了对消息的存储和分发服务,基于发布/订阅模式。

使用步骤

阿里云后台维护消息主题(Topic)

QQ图片20151210161500.png-46.7kB

先在阿里云后台创建消息主题,上图建了两个主题,商品变化和订单变化。

创建消息生产者Producer

也在阿里云后台操作,已经创建好了,只有一个Producer,整个乐虎网通用,名字为PID_HYLEHU。

QQ图片20151210161930.png-43.6kB

这个消息生产者和两个消息主题都关联上了,意味着用这个Producer实现类可以向这两个主题发消息。

往system.properties添加一些ONS基本参数

  1. aliyun_access_key=0nAfYRauR8NVckb9
  2. aliyun_secret_key=jJYJlFdzEGvTM02okhtRIMADHwDsJy
  3. aliyun_region_id=cn-hangzhou
  4. aliyun_ons_region_id=publictest
  5. aliyun_ons_producer_id=PID_HYLEHU

里面是操作汇银阿里云的相关帐号和网络节点配置,以及用于发消息的ProducerId。

注入lazypack-common中封装好的ONS操作类

QQ图片20151210162332.png-26.3kB

在你要发消息的ControllerService中注入这个。

定义事件

阿里云接收的是消息,在这里系统多做了一层包装,把消息包装成一个事件类。
下例中创建了两个事件,一个是商品被创建事件,一个是商品未通过审核事件。

QQ图片20151210162556.png-25.7kB


QQ图片20151210162634.png-98.4kB


QQ图片20151210162637.png-81.9kB

把事件发送给ONS

QQ图片20151210162950.png-72kB
用之前注入的onsService操作,方法只有一个,publishEvent(BaseEvent event);
所以所有的事件都要继承BaseEvent;

用消费者监听器接收事件

以上已经用Producer生产者产生了消息,并发送到了对应的主题。

消费者用于接收消息,消费者在系统中体现为一个监听器listener类,在能接收消息前也要在阿里云维护订阅关系。

QQ图片20151210163342.png-42.8kB

如上图,CID_PRODUCT_UNAPPROVE_SEND_SMS和CID_PRODUCT_LOGGER两个消费者被创建并且都订阅了PRODUCT_CHANGED主题的消息。

消费者的命名是根据其作用命名的,如上,第一个是用来在商品审核不通过时发短信通知,第二个用来是记商品操作日志。

代码中对应这两个消费者的监听器在
QQ图片20151210163629.png-23.5kB

实现监听器中的业务逻辑

以上我们实现了两个监听器,用来在接收到感兴趣的消息时,做进一步的业务处理。
QQ图片20151210164312.png-137.1kB


QQ图片20151210164409.png-122.1kB

以上两个监听器能收到的消息是不一样的,一个订阅了*,在subscribe方法的第三个参数,一个订阅了unapprove。所以第一个监听器能收到PRODUCT_CHANGED主题的全部消息,而第二个只能收到打了tag为unapprove的消息。

这个tag是在事件的构造函数里定义的
QQ图片20151210164823.png-33.9kB


QQ图片20151210164827.png-23.9kB

有了tag,监听器就可以选择性接收和它有关的消息。
最后,如果没有return Action.CommitMessage,消息会在一定间隔后重发给监听器,直到次数上限。

意义

代码解耦:非事务性的,可以异步处理的业务代码,不再写到一个方法中依次触发,避免了事务处理的复杂度,增加稳定性风险。比如发贴之后要给用户发积分,只要把事件(发贴、回贴等)发送到贴子主题,由一个发放积分的监听器接收并判断该发多少分,调用积分接口。将来还可以再增加监听器做别的事情而不会影响到发贴功能代码。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注