Java API + Python AI,實現跨平臺任務調度

2020-12-05 急速馬力快de源碼控

系統架構開發環境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服務將執行測試函數創建的任務

相關焦點

  • PySpark源碼解析,用Python調用高效Scala接口,搞定大規模數據分析
    代碼實現在 python/pyspark/context.py:def_ensure_initialized(cls,instance=None,gateway=None,conf=None):"""CheckswhetheraSparkContextisinitializedornot.ThrowserrorifaSparkContextisalreadyrunning
  • 用Java實現目標檢測|PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。無論是數據的並行處理還是動態計算圖,一切都為Python做出了很多簡化。
  • 用Java實現目標檢測 | PyTorch
    很多論文都選擇使用PyTorch去實現也證明了它在訓練方面的效率以及易用性。在PyTorch領域,儘管部署一個模型有很多選擇,可為Java開發人員準備的選項卻屈指可數。在過去,用戶可以用PyTorch C++ 寫JNI (Java Native Interface) 來實現這個過程。
  • java任務調度之Timer定時器(案例和源碼分析)
    定時器相信大家都不陌生,平時使用定時器就像使用鬧鐘一樣,我們可以在固定的時間做某件事,也可以在固定的時間段重複做某件事,今天就來分析一下java中自帶的定時任務器Timer。一、Timer基本使用在Java中為我們提供了Timer來實現定時任務,當然現在還有很多定時任務框架,比如說Spring、QuartZ、Linux Cron等等,而且性能也更加優越。但是我們想要深入的學習就必須先從最簡單的開始。
  • C/C++、Java、JavaScript、PHP、Python分別用來開發什麼?
    同時,Java在手機領域也有一席之地, 在普遍智能化之前, 很多手機就是以支持java應用作為賣點的,而智慧型手機爆發之後, Java手機主場變成了Android,作為安卓的標準程式語言而存。總結:Java:網頁, 企業級開發, 普通應用軟體, 遊戲後臺。
  • 打工人打工魂,打工的必會java調用python的幾種用法
    本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】,經微信公眾號授權轉載,如需轉載與原文作者聯繫圖丨pexelsjava調用python的幾種用法(看這篇就夠了)在java類中直接執行python語句準備工作:創建maven工程,結構如下:到官網https://www.jython.org
  • 相比於Java,python到底有哪些優勢?
    由於在AI的帶動下python更是異軍突起,撼動了許多老大哥的地位。可唯獨java穩如泰山,不可動搖!自然而然的就會出現python與Java的討論聲。本文的目的在於討論python和java相比到底有哪些優勢,至於缺點暫且不提!
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    文本編碼 13內建函數eval 3項目實戰部分:1項目準備 2遊戲窗口和繪製圖像 3遊戲循環和鍵盤事件 4精靈和精靈組 5框架搭建 6背景圖像 7敵人飛機 8英雄飛機 9發射子彈以及碰撞檢測 4部分視頻課程 1網絡編程 2多任務
  • 三分鐘看懂Python和Java的區別
    對象中封裝了它的狀態變量以及相應的方法,實現了模塊化和信息隱藏;而類則提供了一類對象的原型,並且通過繼承機制,子類可以使用父類所提供的方法,實現了代碼的復用。  而Python既支持面向過程的函數編程也支持面向對象的抽象編程。在面向過程的語言中,程序是由過程或僅僅是可重用代碼的函數構建起來的。在面向對象的語言中,程序是由數據和功能組合而成的對象構建起來的。
  • getty 發布,一個完全基於 java 實現的 aio 框架
    AIO的發布使得實現一套網絡通訊框架變得相對簡單。但如果你不努力,可能也無法理解哦。3、本人對netty比較喜歡,無論是其性能還是編程思想(JBOSS提供的一個java開源網絡框架,可以說是java網絡通訊裡的一哥,極其穩定和強大的性能使得被廣泛使用)4、有了netty為何還要自己造輪子?這裡有兩個原因,其一是本人就喜歡造輪子,這是病,改不了。
  • 用Python畫朵玫瑰,只要五分鐘
    最近一個項目在用python,想著這次不用java了,用python給媽媽個禮物吧。Turtle庫是Python語言中一個非常強大的繪製圖像的函數庫,她提供了很多強大的方法,可以方便快速的繪圖,今天我們就來試一下,畫朵玫瑰送給媽媽。
  • 利用Python來識別並提取圖片中文字
    在文字識別中,許多應用軟體可以幫我們忙,那麼強大的python可以實現圖片中的文字識別嗎?    在學習python的圖像識別中,我們了解到關於中文的識別,效果比較好而且開源的應該就是Tesseract-OCR了,python裡面也有一個包去使用Tesseract-OCR,這個包叫pytesseract。
  • smart-doc 1.9.7 發布,Java 零註解文檔生成工具
    smart-doc是一款同時支持java restful api和apache dubbo rpc接口文檔生成的工具
  • Python實現視頻裁剪添加水印功能
    今天來實現一個利用Python的moviepy類庫裁剪視頻的功能。寫這個功能的初衷是想批量的裁剪一下視頻,下面一起來看一下代碼吧!python目前我們實現的是將單獨一個視頻進行裁剪。本次我們將目前視頻截取一小段內容,並為其添加一個水印圖片。
  • 基於python+OpenCV模塊的人臉識別定位技術
    什麼是OpenCV模塊OpenCV是一款跨平臺的視覺庫,可以支持的作業系統有Linux、Windows和Mac OS作業系統,並且還提供了多種語言的接口,比如Python,java,MATLAB等常用語言。
  • 常用的十大 python 圖像處理工具
    圖像處理中的常見任務包括顯示圖像,基本操作如裁剪、翻轉、旋轉等,圖像分割,分類和特徵提取,圖像恢復和圖像識別。Python成為這種圖像處理任務是一個恰當選擇,這是因為它作為一種科學程式語言正在日益普及,並且在其生態系統中免費提供許多最先進的圖像處理工具供大家使用。
  • Rocket-API 2.3.2 發布,基於 spring boot 的 API 敏捷開發框架
    功能新增或修改: 遠程部署重複判斷 添加mongo對象操作函數 mapping路徑匹配修改,解決restful下路徑可能會匹配執行邏輯錯誤問題 增加配置項 駝峰轉換配置 spring.rocket-api.map-underscore-to-camel-case
  • java基礎教程:Collection集合,Collection 常用API
    集合:集合是java中提供的一種容器,可以用來存儲多個數據。集合和數組既然都是容器,它們有什麼區別呢?數組的長度是固定的。集合的長度是可變的。數組中存儲的是同一類型的元素,可以存儲任意類型數據。集合存儲的都是引用數據類型。如果想存儲基本類型數據需要存儲對應的包裝類型。
  • 「JAVA」萬字長篇詳述字節碼對象與反射機制完成動態編程
    Java 反射在Java的開發環境中,運行java文件需要使用:java xx.java 命令,運行java命令後程序正常執行結束,JVM正常退出;使用System.exit(0)方法,JVM正常退出;程序運行出現異常,並且沒有對異常進行處理(捕獲、或者拋出)時;作業系統強制結束JVM進程,比如:關機、通過任務管理器強制結束等
  • 《小灰教你零基礎學python》-Python入門語言
    程式語言有很多,咱們就學簡單強大的python即可。Python目前是分成2個大版本,python2 和python3,python是完全免費的,所以不用擔心版權問題,因為python2已經廢棄,所以咱們這套課程完全基於python3。