一 系统架构二 开发环境三 API接口服务四 AI业务处理服务五 任务处理请求信息发送和接收六 业务处理服务集成Celery任务调度
为什么要跨平台呢?
1,Java + Spring Boot开发Web服务是常用搭配,丰富的组件和易用的功能;
2,Python在AI领域是主流开发语言,实现业务处理更方便,不需要代码移植;
3,招聘工程师组建技术团队有针对性,发挥各自优势。
一,系统架构
ActiveMQ是一个非常流行的消息队列服务中间件,基于JMS(Java Message Service)规范。
Celery是一个灵活可靠的分布式系统,用于异步任务调度,系统通常将一些耗时的操作任务提交给Celery去异步执行,典型系统架构示意图如下:
本文基于Java + Spring Boot,Python + Django,集成ActiveMQ和Celery,搭建起一个跨平台异步任务调度系统。
API接口服务
├── controller│ └── CheckController.java├── mq│ └── MqService.java│ └── MqConsumer.java
AI业务处理服务
├── celery.py├── tasks.py├── mq│ └── mq_service.py│ └── mq_listener.py
二,开发环境
系统依赖ActiveMQ和Redis运行,手动安装配置稍显繁琐,可以使用Docker一键部署,下载资源编排脚本后运行docker-compose up -d
开发环境部署
├── docker-compose.yml├── up.sh
三,API接口服务
Spring Boot集成ActiveMQ只需简单配置,开发步骤如下:
1,在application.yml中配置ActiveMQ服务器信息
spring:activemq:broker-url:tcp://127.0.0.1:61616user:adminpassword:adminin-memory:falsepackages:trust-all:truepool:enabled:false
2,MqService封装了消息发送功能,注意Java环境下使用文本消息TextMessage,发送时将Map转换为JSON字符串,和Python环境下STOMP简单文本协议对应。
3,MqConsumer.java接收任务处理状态消息,使用的是发布订阅消息Topic
4,配置完成后,启动API服务,运行单元测试验证消息发送接收功能
5,API服务接收到的状态信息
四,AI业务处理服务
Python集成ActiveMQ使用stomp.py,基于STOMP协议(端口为61613),简单(流)文本消息,开发步骤如下:
1,将ActiveMQ服务器地址等信息配置在settings.py中,方便维护管理
MQ_URL = '127.0.0.1'MQ_PORT = 61613MQ_USER = 'admin'MQ_PASSWORD = 'admin'MQ_QUEUE = '/queue/starter.process'MQ_TOPIC = '/topic/starter.status'
2,为了增加代码的兼容和容错能力,封装辅助函数send_msg(), consume_msg(), get_conn(), close_conn(),详见代码文件mq_service.py
3,增加mq_listener.py,声明消息处理类,继承stomp.ConnectionListener,在on_message()函数中将消息字符串解析为JSON,注意STOMP协议只支持简单文本协议,所以此步转换是必须的。
4,根据接收到的消息内容创建一个异步任务
5,封装一个Django Command,调用comsume_msg启动消息监听服务,代码在目录management/commands下的mq.py
6,运行命令python manage.py mq,看到消息提示,启动监听服务成功
7,增加测试test_mq_service.py,发送消息
8,运行测试python manage.py test,看到消息发送和接收
五,任务处理请求信息发送和接收
现在API服务和AI业务处理服务已经能够发送和接收ActiveMQ消息,将它们连接起来:
1,API服务:REST接口处理客户端请求时,发送业务处理消息,使用点对点消息Queue, CheckController.java
2,业务处理服务:消息监听服务接收到请求消息,调用Celery创建一个异步任务,代码mq_listener.py,调用tasks.py中do_task()函数
3,将异步任务创建功能封装为dispatch_task()函数
4,Celery异步任务处理时,发送状态信息到API服务,代码tasks.py,Celery的集成方法见下一章节。
5,API服务接收到信息,更新状态并通知客户端,代码MqConsumer.java
消息格式转换过程:
基本时序图如下:
六,AI业务处理服务集成Celery
Django集成Celery配置方法步骤如下:
1. 增加celery.py,配置信息
2. 打开settings.py,配置BROKER和BACKEND地址
CELERY_BROKER = 'redis://127.0.0.1:6379/2'CELERY_BACKEND = 'redis://127.0.0.1:6379/3'
3. 打开__init__.py,增加代码
from __future__ import absolute_import, unicode_literalsfrom .celery import app as celery_app__all__ = ['celery_app']
4. 增加tasks.py,声明异步任务。任务处理过程中将调用mq_service发送状态信息到API服务,Topic类型的文本信息
5. 正确配置后,运行命令启动celery worker异步任务处理服务:celery -A hello_celery worker -l info -P eventlet,注意Win10环境中需要增加eventlet,Celery成功启动信息:
6. 增加单元测试test_task_util.py,创建一个任务
7. 运行python manage.py test,Celery服务将执行测试函数创建的任务