第三方介入开放平台后,开放平台须要将设备状态、属性等值发给第三方,目前使用的方案是HTTP方式推送,可是因为数据量大,使用HTTP推送有很大的局限性;php
通过评估,使用rocketmq可很好的解决该问题;html
开放平台将设备状态、属性值等资源发送到MQ,第三方消费对应的topic便可java
利用rocketmq的acl功能,开放平台使用admin权限,根据appid将设备信息发送到对应的topic,而后再开放平台上开放指定的topic的订阅权限node
官网地址:http://rocketmq.apache.org/ python
下载安装包及源码地址:https://github.com/apache/rocketmqc++
ACL权限控制:https://github.com/apache/rocketmq/blob/master/docs/cn/acl/user_guide.mdgit
rocketmq console支持acl issue:https://github.com/apache/rocketmq-externals/pull/244 该功能未上线,master代码也无github
多topic时,rocketmq性能影响:https://www.cnblogs.com/felixzh/p/6198174.html----rocketmq支持万级别的topic(broker和nameserver心跳时,万级别topic可能须要发送几十m的数据)apache
rocketmq使用netty作的长链接,netty单机长链接数支持万级别----rocketmq长链接理论知足业务要求api
rocketmq源码编译步骤:
一、下载源码包(https://github.com/apache/rocketmq),获得源码 rocketmq-master.zip
二、解压unzip rocketmq-master.zip
三、cd rocketmq-master
四、idea导入工程
五、maven编译
mvn -Prelease-all -DskipTests clean install -U
六、cd distribution/target/rocketmq-4.5.2/rocketmq-4.5.2/conf
七、修改broker.conf ,开启acl, 新增一行:aclEnable=true
八、返回主目录:cd ..
九、启动namesrv:nohup sh bin/mqnamesrv &
十、启动broke:nohup sh bin/mqbroker -c conf/broker.conf -n localhost:9876 &
建立或修改ACL用户信息:
sh mqadmin updateAclConfig -n 127.0.0.1:9876 -b 127.0.0.1:10911 -a RocketMQ111 -s 1234567809123 -t topicH=SUB -g groupH=SUB
其余命令参见:
https://github.com/apache/rocketmq/blob/master/docs/cn/acl/user_guide.md
查看用户信息见文件:
more ../conf/plain_acl.yml
rocketmq加上ACL后,mqadmin支持命令以下:
类型 |
是否支持 |
命令 |
不添加ACL |
|
---|---|---|---|---|
查询ACL版本信息 | 支持 | sh mqadmin clusterAclConfigVersion -n 127.0.0.1:9876 -c DefaultCluster |
不支持 | |
查看集群 | 支持 | sh mqadmin clusterList -n 127.0.0.1:9876 |
支持 | |
删除用户 | 支持 | sh mqadmin deleteAccessConfig -n 127.0.0.1:9876 -c DefaultCluster -a RocketMQ222 |
不支持 | |
删除topic | 支持 | sh mqadmin deleteTopic -c DefaultCluster -n 127.0.0.1:9876 -t topicq |
支持 | |
根据id查询消息 | 支持 | sh mqadmin queryMsgById -i 0A0007AD00002A9F000000000000AD3E -n 127.0.0.1:9876 |
支持 | |
根据key查询消息 | 不支持 | sh mqadmin queryMsgByKey -n 127.0.0.1:9876 -t topicH -k 12345678 |
支持 | https://github.com/apache/rocketmq/issues/1409 |
查看topic列表 | 支持 | sh mqadmin topicList –n 127.0.0.1:9876 |
支持 | |
Topic路由信息 |
支持 | sh mqadmin topicRoute -n 127.0.0.1:9876 -t topicH |
支持 | |
topic统计信息 | 支持 | sh mqadmin topicStatus -t topicH -n 127.0.0.1:9876 |
支持 | |
建立或更新用户 | 支持 | sh mqadmin updateAclConfig -n 127.0.0.1:9876 -b 127.0.0.1:10911 -a RocketMQ222 -s 1234567809123 -t topicJ=SUB -g groupJ=SUB | 不支持 | |
建立topic | 支持 | sh mqadmin updateTopic -b 127.0.0.1:10911 -t topicq |
支持 |
可能BUG点:
producer.queryMessage 没法根据key查询
producer.viewMessage没法根据msgid查询sendResult.getMsgId(),只能根据union key查询!不开启acl可查询
充分利用rocketmq-console的功能,在开放平台调用rocketmq-console api便可以作到建立topic等一系列页面可进行的操做
(不建议直接去操做mqadmin,其实操做原理就是rocketmq-console的代码逻辑)
调用流程以下图
风险点:
一、rocketmq-console不支持ACL(支持时间点未知)
二、自编译及部署rocketmq-console,调用API时可能须要公网调用(后期可视状况集成到eureka)
语言 |
git链接地址 |
来源 |
star |
---|---|---|---|
语言 |
git链接地址 |
来源 |
star |
java | |||
Node.js |
https://github.com/apache/rocketmq-client-nodejs | 70 | |
go | https://github.com/apache/rocketmq-client-go | 159 | |
php | https://github.com/apache/rocketmq-externals/tree/master/rocketmq-client-php https://github.com/apache/rocketmq-externals/tree/master/rocketmq-php |
rocketmq-externals | 1981(externals) |
.net | https://github.com/apache/rocketmq-externals/tree/master/rocketmq-client-dotnet | rocketmq-externals | 1981(externals) |
c++ | https://github.com/apache/rocketmq-client-cpp | 134 | |
python | 44(已验证) 69 |
其余未竞功能参考连接:https://helpcdn.aliyun.com/document_detail/102996.html?spm=a2c4g.11174283.6.605.51f2449cmu4RPW