Python3.5 RocketMQ

    目前RocketMQ社区已经发布RocketMQ python客户端,见:https://github.com/messense/rocketmq-python。本文可以作为python调用java的一种借鉴。


尽管RocketMQ作为阿里一个优秀的消息中间件,不仅在阿里内部使用非常广,在行业内应用也非常的多,但是RocketMQ本身确没有直接提供Python客户端,这对于python程序员来说是多么的不友好。而我司又有一部分算法工程师是使用python的,为了解决他们从MQ获取数据的问题,有两种方案:1、通过某个java服务进行数据转发,即算法将数据发送到kafka,定制一个java服务通过一定的规则将数据转发到RocketMQ;2、Python调用java代码,实现与RocketMQ的通信。第一种方案需要有人专门去维护数据转发的java服务,耦合性较大,思考再三,还是决定使用方案二。

既然决定使用第二种方案,那就要解决python调用java代码的问题。python调用java代码有几种方案,这里推荐使用jpype1。在win上安装jpype1,一开始也是走了不少的弯路,直接使用pip install并不成功,需要安装visio C++ stdio 2015,但是安装上后依旧安装不成功。这里介绍一种很方便的方式,到https://www.lfd.uci.edu/~gohlke/pythonlibs/中根据环境下载对应的whl文件,如下图:

我这使用的是python3.5,win7 64位系统,所以下载JPype1‑0.6.3‑cp35‑cp35m‑win_amd64.whl,下载成功后,使用pip install C:\Users\xxx\Downloads\JPype1‑0.6.3‑cp35‑cp35m‑win_amd64.whl 即可,心疼下走了半天弯路的自己。好了,环境解决了,接下来就是代码的实现了。

先列出参照资料:

https://github.com/GangLuICT/RMQ-Client4Python 

上面的代码看似非常完美,不过是基于python2写的,但是尽管改成python3的,运行时在注册RocketMQ的回调时一直提示存在多个重载,后决定利用java基于rocketmq-client封装一层jar,废话不多说,直接给代码:

链接:https://download.csdn.net/download/u013827270/10738917

其中:

        1、lib下为java消费RocketMQ需要的依赖,clife-utils-mq-0.0.16-SNAPSHOT.jar为我基于rocketmq-client自定义jar

        2、conf下为logback的日志配置文件,修改对应配置可以控制jvm日志级别

        3、考虑到算法会应用到许多python的模块,为了避免在回调中应用到python的模块,从而导致无法被序列号到jvm中执行,在消费者中和生产者中都应用到了python的多进程,启动一个专门的进程维护jvm,并通过一个Queue进程数据共享。

-------------------------------------手动分割线----------------------------------

        近期有收到私信问题,这里对一些问题做一个统一的回答。

1、如何实现只消费指定tag

     这个其实很简单,稍微看看给的代码就可以看到。如下图:

2、如何实现有序消费

      这个在开发时,笔者有考虑到这个需求,只不过Python接口对算法工程师隐藏了这项配置。

        同问题1,consumerConfig2存在一个isOrderly的参数,默认为false,如果需要实现有序消费只需要增加如下代码即可。

你可能感兴趣的:(Python3.5 RocketMQ)