杜冬梅 許志坤 蘇健



摘要:遠程培訓是郵政網絡學院的重要功能。由于學員參加遠程培訓,通過課程學習、作業、考試、問卷等多個環節才能合格,所以判斷學員培訓是否合格邏輯比較復雜。傳統技術架構進行班級合格的實時處理,消耗系統性能,影響正常業務開展,一般在晚上空閑時間采用批處理方式進行處理,學員當天培訓合格,滯后一天獲得培訓結果。采用微服務架構,合理進行微服務拆分,結合消息隊列等機制,可以在保證系統正常運行的情況下,對學員培訓合格進行實時處理,提高了學員參加遠程培訓的學習體驗。
關鍵詞:Spring Cloud;Eureka;Zuul;RocketMQ
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2021)08-0149-03
Abstract: Distance training is an important function of post network college. Because the trainees can pass the remote train by course study, homework, examination and other links , the logic of judging whether the trainees are qualified or not is very complex. The real-time processing in the form of single application consumes the system performance, so the general application system uses batch processing in the idle time at night. Using microservice architecture, combined with message queue, can realize real-time judgment for the remote training base on the normal operation of the system.The learning experience of distance training is improved.
Key words: Spring Cloud; Eureka; Zuul; RocketMQ
1 背景
遠程培訓是郵政網絡培訓學院重要功能,學員參加遠程培訓,通過課程學習、作業、考試等多個環節才能合格,學員完成滿足班級合格的任一條件,都可能觸發班級合格。采用傳統的單體應用模式,如果在學員完成任一操作后都實時判斷是否班級合格,在學習高峰時段會大大影響系統性能。所以一般情況下,應用系統會在晚上定時處理班級合格,第二天將合格情況反饋給學員。學員培訓合格后會滯后一天得到培訓結果,這對于需要培訓班合格才能參加后續考試、競賽或其他活動的學員,帶來諸多不便。
采用基于微服務架構的遠程培訓實時合格方案,結合消息隊列機制,系統可以實時進行培訓班合格的處理,方便學員參加后續活動的同時,給學員帶來了更好的學習體驗。
2 微服務架構
2.1 綜述
當前流行的微服務架構中,Dubbo 和Spring Cloud使用的相對較多。Dubbo在服務治理方面很出色但開發難度稍大,且在網關、服務跟蹤等方面都不及Spring Cloud[1]。反觀Spring Cloud則包含分布式配置、網關、服務跟蹤、斷路器等功能,具備一整套解決方案[2]。
2.2 服務治理組件Eureka
Eureka是Spring Cloud的注冊中心[2]。微服務之間互相調用,通過Eureka進行。在注冊中心注冊的服務,才能被發現、獲取并調用。Eureka作為Spring Cloud核心組件,使得當某個微服務增加或減少服務節點后,不需要通知調用方增加或減少的IP地址等相關調用信息,應用系統通過水平擴展提高系統性能更加便捷。
2.3 服務網關Zuul
Spring Cloud Zuul 是微服務架構中的API網關。服務調用端調用后端的微服務,不能直接調用,而是通過Zuul根據請求的url進行服務轉發。Zuul位于后端服務和調用端之間,簡化了客戶端調用時的復雜度,通過Zuul還可以對調用方的權限進行檢查控制,所以它同時也可以提供監控、安全等相關服務[2]。
2.4 消息中間件RocketMq
消息隊列作為高并發系統的核心組件之一,能夠幫助業務系統解構,提升開發效率和系統穩定性。消息中間件包括消息生產者和消費者兩個角色:消息生產者負責創建消息并發送到消息服務器,消息消費者從消息服務器拉取消息并提交給應用消費[3]。Topic是消息最細粒度的訂閱單位,是生產者傳遞消息和消費者提取消息的標識。消息中間件處理模型如下。
Rocket MQ 是一款分布式、隊列模型的消息中間件,支持事務消息、順序消息、批量消息、定時消息、消息回溯等,具有高性能、高可靠、高實時、分布式特點[4],支持拉(pull)和推(push)兩種消息模式,具備億級消息堆積能力。
2.5 微服務拆分
采用微服務架構進行應用系統設計,微服務劃分十分重要。服務拆分的顆粒度是微服務架構應用系統實現的關鍵,是系統建成后運維工作、系統運行性能等的基礎。盡量單一職責、高內聚低耦合、易拆分、易理解、易修改替換、易部署,都是好的微服務架構應有的特征[5]。
3 系統設計與實現
3.1 業務流程
學員參加遠程培訓班,合格條件從大的方面可以分為與具體課程有關、與具體課程無關兩個方面。
與課程有關的培訓班合格條件,包括課程學習、課程作業、課程考試。每個環節完成之后,需要判斷課程所在的必修課或選修課是否合格,進而判斷是否能夠導致班級合格。與課程無關的培訓班合格條件,包括綜合考試、綜合作業、集中互動、調查問卷。每個環節的合格,都可能導致學員班級合格。主要流程如下圖。
3.2 微服務拆分
從業務流程中可看出,課程合格的各個條件相互獨立。遵循微服務拆分原則,將班級合格的各個條件課程學習、課程作業、課程考試、綜合考試等劃分為7個獨立的微服務。學員在網院完成班級培訓的某項學習任務,通過網關調用相應微服務,進行消息隊列的生成,消息消費者獲取消息隊列的消息,進行班級合格的處理,保證學員實時合格。
3.3 技術架構
系統采用基于Spring Cloud的微服務架構,注冊配置中心采用Eurake,網關采用Zuul,消息隊列采用Rocket MQ,技術架構圖如下。
接入端提供全局的負載均衡功能,具有大量、高并發的接入請求處理能力;業務應用通過服務注冊的方式調用基礎服務功能;采用消息處理方式,在服務請求量大的情況下采用異步調用,保證用戶體驗的友好性;課程學習、課程作業等基礎服務彼此獨立,某一個服務的改造升級不會影響其他服務的功能,便于平臺的功能擴展;采用redis內存數據庫集群提高系統運行性能。
3.4 系統實現
系統實現的核心為消息隊列,消息隊列機制保證了業務繁忙時間,班級合格處理不影響主流業務的正常開展。
3.4.1 消息隊列生成
以課程學習為例,課程學習完成,生成消息并發送到消息隊列。
package cn.cpoc.cla.portal.cla.mq.channel.impl;
import cn.cpoc.cla.channel.ClaClaQuesProvChanSource;
Import ...;
@EnableBinding({ ClaCourseStudyProvChanSource.class})
@Service
public class ClaCourseStudyProvChanSourceServiceImpl implements ClaCourseStudyProvChanSourceService {
@Autowired
private ClaCourseStudyProvChanSource claCourseStudyProvChanSource;
@Override
public boolean courseStudySource(PxClassClassrcdInfo pxClassClassrcdInfo) {
String uuid= UUID.randomUUID().toString();
Message message = MessageBuilder.withPayload(pxClassClassrcdInfo)
.setHeader(MessageConst.PROPERTY_KEYS, uuid+"--"+pxClassClassrcdInfo.getClassclassrcdid().toString())
.setHeader(MessageConst.PROPERTY_TAGS, ClaCourseStudyProvChanSinkService.COURSE_STUDY_SINK_METHOD_TAG)
.setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON).build();? ---生成消息
return claCourseStudyProvChanSource.source().send(message);? --發送到消息隊列
}
}
3.4.2 消息隊列監聽
課程學習、課程考試、綜合考試等分別有各自的消息監聽,監聽消息隊列中屬于自己的消息,進行相應處理。以課程學習為例,消息監聽實現如下。
package cn.cpoc.cla.course.study.provider.channel.impl;
import cn.cpoc.cla.channel.ClaCourseExamProvChanSink;
import ...;
....
public class ClaCourseStudyProvChanSinkServiceImpl implements ClaCourseStudyProvChanSinkService {
private final static Logger logger = LoggerFactory.getLogger(ClaCourseStudyProvChanSinkServiceImpl.class);
@Autowired
private IBjhgByKcxxService iBjhgByKcxxService;
/* 學員通過課程學習觸發班級合格*/
@Override
@StreamListener(value = ClaCourseStudyProvChanSink.SINK_CHANNEL,condition = COURSE_STUDY_SINK_METHOD)
public void courseStudySink(@Payload PxClassClassrcdInfo pxClassClassrcdInfo,@Header(name = "KEYS") Object key) {
try{
logger.info("key:"+key+" pxClassClassrcdInfo:"+pxClassClassrcdInfo.toString());
long count =redisTemplate.opsForValue().increment(key.toString(), 1);
logger.info("pxClassClassrcdInfo conut:" + count );
if(count==1){
redisTemplate.expire(key.toString(), 4, TimeUnit.DAYS);
iBjhgByKcxxService.setBjhbByKcxx(pxClassClassrcdInfo); --班級合格處理
}else{
logger.info("courseStudySink repeat key:" + key +" pxClassClassrcdInfo:"+pxClassClassrcdInfo.toString());
}
}
}
4 結束語
采用微服務架構實現遠程培訓班的實時合格功能,在學習高峰期會以消息隊列的形式進行異步處理,不影響遠程培訓主流業務的運行性能。學員完成培訓班學習后,合格信息會很快反饋給學員,提升了學員的學習體驗。同時,如果培訓班合格條件發生變化,微服務架構會以修改或增加單個微服務的方式快速應對業務變化。
參考文獻:
[1] 譚鋒.Spring Cloud Alibaba微服務原理與實戰[M].北京:電子工業出版社,2020.
[2] 方志朋.深入理解Spring Cloud與微服務構建[M].北京:人民郵電出版社,2018.
[3] 歐志芳.基于RocketMQ實現異構數據庫同步[J].網絡安全技術與應用,2016(12):99-100.
[4] 馬躍,顏睿陽,孫建偉.基于RocketMQ的MQTT消息推送服務器分布式部署方案[J].計算機系統應用,2018,27(6):83-86.
[5] 克里斯·理查森.微服務架構設計模式[M].北京:機械工業出版社,2019.
【通聯編輯:謝媛媛】