背景
第三方介入开放平台后,开放平台需要将设备状态、属性等值发给第三方,目前使用的方案是HTTP方式推送,但是由于数据量大,使用HTTP推送有很大的局限性;
经过评估,使用rocketmq可很好的解决该问题;
解决方案
开放平台将设备状态、属性值等资源发送到MQ,第三方消费对应的topic即可
安全方案
利用rocketmq的acl功能,开放平台使用admin权限,根据appid将设备信息发送到对应的topic,然后再开放平台上开放指定的topic的订阅权限
技术评估
官网地址:http://rocketmq.apache.org/
下载安装包及源码地址:https://github.com/apache/rocketmq
ACL权限控制:https://github.com/apache/rocketmq/blob/master/docs/cn/acl/user_guide.md
rocketmq console支持acl issue:https://github.com/apache/rocketmq-externals/pull/244 该功能未上线,master代码也无
多topic时,rocketmq性能影响:https://www.cnblogs.com/felixzh/p/6198174.html----rocketmq支持万级别的topic(broker和nameserver心跳时,万级别topic可能需要发送几十m的数据)
rocketmq使用netty做的长连接,netty单机长连接数支持万级别----rocketmq长连接理论满足业务要求
ACL mqadmin配置管理命令只有在4.5.2才有,自编译安装包
rocketmq源码编译步骤:
1、下载源码包(https://github.com/apache/rocketmq),得到源码 rocketmq-master.zip
2、解压unzip rocketmq-master.zip
3、cd rocketmq-master
4、idea导入工程
5、maven编译
mvn -Prelease-all -DskipTests clean install -U
6、cd distribution/target/rocketmq-4.5.2/rocketmq-4.5.2/conf
7、修改broker.conf ,开启acl, 新增一行:aclEnable=true
8、返回主目录:cd ..
9、启动namesrv:nohup sh bin/mqnamesrv &
10、启动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管理后台集成:
充分利用rocketmq-console的功能,在开放平台调用rocketmq-console api即可以做到创建topic等一系列页面可进行的操作
(不建议直接去操作mqadmin,其实操作原理就是rocketmq-console的代码逻辑)
调用流程如下图
风险点:
1、rocketmq-console不支持ACL(支持时间点未知)
2、自编译及部署rocketmq-console,调用API时可能需要公网调用(后期可视情况集成到eureka)
各语言SDK
语言 |
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