第三方推送方案选择

原创
2019/11/12 15:21
阅读数 539

背景

第三方介入开放平台后,开放平台需要将设备状态、属性等值发给第三方,目前使用的方案是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 &

rocketmq-4.5.2.tar.gz

创建或修改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

https://github.com/messense/rocketmq-python

https://github.com/apache/rocketmq-client-python

 

44(已验证)

69

 

其他未竞功能参考链接:https://helpcdn.aliyun.com/document_detail/102996.html?spm=a2c4g.11174283.6.605.51f2449cmu4RPW

 

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部