1. 程式人生 > >二、kafka專案例項

二、kafka專案例項

http://www.cnblogs.com/darkprince/p/5114425.html

開發Kafka通用資料平臺中介軟體

(含本次專案全部程式碼及資源)

目錄:

一. Kafka概述

二. Kafka啟動命令

三.我們為什麼使用Kafka

四. Kafka資料平臺中介軟體設計及程式碼解析

五.未來Kafka開發任務

一. Kafka概述

  Kafka是Linkedin於2010年12月份建立的開源訊息系統,它主要用於處理活躍的流式資料。活躍的流式資料在web網站應用中非常常見,這些活動資料包括頁面訪問量(Page View)、被檢視內容方面的資訊以及搜尋情況等內容。 這些資料通常以日誌的形式記錄下來,然後每隔一段時間進行一次統計分析。

  傳統的日誌分析系統是一種離線處理日誌資訊的方式,但若要進行實時處理,通常會有較大延遲。而現有的訊息佇列系統能夠很好的處理實時或者近似實時的應用,但未處理的資料通常不會寫到磁碟上,這對於Hadoop之類,間隔時間較長的離線應用而言,在資料安全上會出現問題。Kafka正是為了解決以上問題而設計的,它能夠很好地進行離線和線上應用。

1.1 Kfka部署結構:

(圖1)

 

1.2 Kafka關鍵字:

•Broker : Kafka訊息伺服器,訊息中心。一個Broker可以容納多個Topic。

•Producer :訊息生產者,就是向Kafka broker發訊息的客戶端。

•Consumer :訊息消費者,向Kafka broker取訊息的客戶端。

•Zookeeper :管理Producer,Broker,Consumer的動態加入與離開。

•Topic :可以為各種訊息劃分為多個不同的主題,Topic就是主題名稱。Producer可以針對某個主題進行生產,Consumer可以針對某個主題進行訂閱。

•Consumer Group: Kafka採用廣播的方式進行訊息分發,而Consumer叢集在消費某Topic時, Zookeeper會為該叢集建立Offset消費偏移量,最新Consumer加入並消費該主題時,可以從最新的Offset點開始消費。

•Partition:Kafka採用對資料檔案切片(Partition)的方式可以將一個Topic可以分佈儲存到多個Broker上,一個Topic可以分為多個Partition。在多個Consumer併發訪問一個partition會有同步鎖控制。

(圖2)

 

1.3 訊息收發流程:

•啟動Zookeeper及Broker.

•Producer連線Broker後,將訊息釋出到Broker中指定Topic上(可以指定Patition)。

•Broker叢集接收到Producer發過來的訊息後,將其持久化到硬碟,並將訊息該保留指定時長(可配置),而不關注訊息是否被消費。

•Consumer連線到Broker後,啟動訊息泵對Broker進行偵聽,當有訊息到來時,會觸發訊息泵迴圈獲取訊息,獲取訊息後Zookeeper將記錄該Consumer的訊息Offset。

1.4 Kafka特性:

•高吞吐量

•負載均衡:通過zookeeper對Producer,Broker,Consumer的動態加入與離開進行管理。

•拉取系統:由於kafka broker會持久化資料,broker沒有記憶體壓力,因此,consumer非常適合採取pull的方式消費資料

•動態擴充套件:當需要增加broker結點時,新增的broker會向zookeeper註冊,而producer及consumer會通過zookeeper感知這些變化,並及時作出調整。

•訊息刪除策略:資料檔案將會根據broker中的配置要求,保留一定的時間之後刪除。kafka通過這種簡單的手段,來釋放磁碟空間。

二. Kafka啟動命令:

啟動Zookeeper服務:

zookeeper-server-start.bat ../../config/zookeeper.properties

啟動Broker服務:

kafka-server-start.bat ../../config/server.properties

通過Zookeeper的協調在Broker中建立一個Topic(主題)

kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testTopic

查詢當前Broker中某個指定主題的配置資訊

kafka-run-class.bat kafka.admin.TopicCommand --describe --zookeeper localhost:2181 --topic testTopic

啟動一個數據生產者Producer

kafka-console-producer.bat --broker-list localhost:9092 --topic testTopic  

啟動一個數據消費者Consumer

kafka-console-consumer.bat --zookeeper localhost:2181 --topic testTopic --from-beginning

Zookeeper配置檔案,zookeeper.properties配置片段

Broker配置檔案,server.properties配置片段

 

關於kafka收發訊息相關的配置項

1.在Broker Server中屬性(這些屬性需要在Server啟動時載入):

//每次Broker Server能夠接收的最大包大小,該引數要與consumer的fetch.message.max.bytes屬性進行匹配使用

* message.max.bytes 1000000(預設) 

//Broker Server中針對Producer傳送方的資料緩衝區。Broker Server會利用該緩衝區迴圈接收來至Producer的資料 包,緩衝區過小會導致對該資料包的分段數量增加,但不會影響資料包尺寸限制問題。

socket.send.buffer.bytes 100 * 1024(預設)

//Broker Server中針對Consumer接收方的資料緩衝區。意思同上。

socket.receive.buffer.bytes 100 * 1024(預設)

//Broker Server中針對每次請求最大的緩衝區尺寸,包括Prodcuer和Consumer雙方。該值必須大於 message.max.bytes屬性

* socket.request.max.bytes 100 * 1024 * 1024(預設)

2.在Consumer中的屬性(這些屬性需要在程式中配置Consumer時設定)

//Consumer用於接收來自Broker的資料緩衝區,意思同socket.send.buffer.bytes。

socket.receive.buffer.bytes 64 * 1024(預設)

//Consumer用於每次接收訊息包的最大尺寸,該屬性需要與Broker中的message.max.bytes屬性配對使用

* fetch.message.max.bytes 1024 * 1024(預設)

3.在Producer中的屬性(這些屬性需要在程式中配置Consumer時設定)

//Producer用於傳送資料緩衝區,意思同socket.send.buffer.bytes。

send.buffer.bytes 100 * 1024(預設)

三. 我們為什麼使用Kafka

當前專案中,我們更希望從企業獲得儘可能多的有價值資料。最直接獲取大資料的方式是採用寫應用直連目標企業資料庫來獲得資料。但這種方式在實際應用中,會由於企業擔心開放本地資料庫而導致的安全隱患很難實施。另外,這種方式會與企業本地資料庫結構耦合度過高,會出現多家企業多個應用的情況,缺少統一的資料互動平臺,導致後期維護困難。

3.1 Kafka在當前專案中問題:

當前案例,我們想把某企業的本地資料實時同步到資料中心中,之後對這些資料進行二次分析處理。我們的目標是建立統一的資料同步平臺,便於在日後的多企業多系統中能有統一的實施標準,所以選用了Kafka訊息系統作為支撐。

Producer(資料傳送方)以獨立執行緒方式常駐某企業內部應用中,依靠一定的時間週期,從本地資料庫獲得資料並推送至Broker中。而Consumer(快銷組資料接收方)也是獨立與WEB框架常駐記憶體,獲得資料訊息後儲存至資料中心中。

但目前Kafka在實施中面臨以下問題:

1.Producer/Consumer均獨立於Web框架,Producer依靠訊息片輪詢檢索/傳送最新資料,執行效率低。

2.Producer會直接針對某企業內部資料庫表結構操作,導致程式碼與企業業務耦合度過高,而無法平滑移植到其他企業系統中。

3.由於Producer/Consumer是獨立於Web框架的,在外圍負責資料的採集及推送,與Web專案主程式無切合度。

4.目前針對Kafka的資料傳輸異常處理比較簡陋,當Broker或 Zookeeper等出現異常時,有可能會導致資料安全性問題。

3.2實現目標:

針對以上問題,我們要實現如下目標:

 

1.把Producer/Consumer的資料推送/獲取的過程封裝成Class或者Jar包的形式,供Java Web框架呼叫,從而形成與企業內部Web應用或計算中心資料分析Web應用融合一體。

2.資料的推送/獲取只針對Java Object物件,不要針對資料庫表結構,不能與企業特有資料耦合度過高,形成通用的資料介面。Producer需要對Object進行序列化,Consumer需要對序列化後的二進位制資訊進行反序列化重建Object返回給呼叫者。

3.訊息的推送/獲取的整個生命週期中,要把重要事件通知給外部呼叫者,比如:Broker,Zookeeper是否有異常,資料推送/獲取是否成功,如果失敗需要保留失敗記錄便於進行後期資料恢復等。(需要在中介軟體中建立回撥機制通知呼叫者)

4.可對多企業多應用進行平滑移植,移植過程中儘可能保持整體Kafka資料平臺結構的零修改。

四. Kafka資料平臺中介軟體設計

4.1解決方案:

基於以上待完成目標,我們有了以下解決方案。

 

3.2 實現要點:

KfkProducer(資料生產者)

•KfkProducer物件需要在Web框架中的Application_OnStart()中啟動,常駐程序,只與Broker連線一次,資料傳送過程不能與Broker建立連線。(實踐中發現Kafka的 Broker如果有異常,重啟Broker後Producer不用再次連線即可傳送)

•Web框架可以隨時呼叫推送介面將物件(Object)推送至Broker.

•Object序列化後形成二進位制資訊,並且要保證在Consumer所處框架中能順利還原.

•可傳送多種物件(Object,File ,Byte[]等),簡化外圍框架針對待發送資料所做操作,簡化呼叫介面。

•資料傳送使用Kafka中最新的非同步式資料傳送API,不能由於傳送時間過長或Broker異常等問題阻塞呼叫者。

•需要對整個傳送生命期進行跟蹤反饋異常資訊,若傳送失敗,需要將待發送資料使用回撥機制通知到框架呼叫者。

•詳細測試Broker,或Zookeeper產生異常時,Producer可能會出現的情況。

•在針對多企業多應用中,可依靠Topic進行區分資料主題,這樣可實現多應用部署時框架零修改問題。

KfkConsumer(資料消費者)

•KfkConsumer需要在計算中心內部Web框架中的Application_OnStart()中啟動,常駐程序,只與Broker連線一次,並啟動訊息泵等待訊息到來。(實踐中發現Kafka的 Broker如果有異常,重啟Broker後Consumer不用再次連線即可正常獲取訊息)

•需要定義回撥介面,該回調介面由外圍框架程式註冊處理程式,當資料訊息到來時,Consumer需要把資料傳送至該介面,之後由呼叫者處理。

•呼叫者需要註冊所接受的物件型別,因為Broker中同一Topic下會有各種資料物件(UserInfo,CompanyInfo,ProductInfo...)存在,所以必須提供接收物件的註冊介面,以方便呼叫者有針對性的獲取。

•資料到來時,要針對傳送方序列化的二進位制資訊進行反序列化操作,並能準確還原成原始物件。

•需要對整個接收生命期進行跟蹤反饋異常資訊,若訊息泵停止或異常,需要通知到框架呼叫者。

實現以上要點後,需要將KfkProducer及KfkConsumer物件打包成Jar包的形式,更靈活的部署到企業本地Web框架及計算中心內部Web框架中。

3.3 程式碼實現及分析:

3.3.1 KfkProducer 物件:資料生產者物件,封裝了關於資料傳送的相關功能。

介面函式/子物件

說明

KfkProducer ()

建構函式中需要呼叫者提供Broker叢集的Ip,Port等資訊。

Kafka支援Broker叢集列表。(127.0.0.1:9092,127.0.0.1:9093)

Connect()

該函式需要完成對Broker叢集的連線。

Send()

該函式入口為Object物件,需要對該物件進行Serialize操作,根據待發送資料構造KfkMsg物件,並取得由KfkMsg序列化後的Byte[]陣列,之後呼叫Kafka的非同步傳送方式及掛接回調處理函式。

要實現多個Send()介面,需要提供對Object,File ,Byte[]等多種資料型別的支援,方便呼叫者操作。

Close()

該函式完成對Broker連線進行關閉。

SendCallback傳送回撥物件

onCompletion()傳送回撥介面

在kafka非同步傳送函式send()中註冊,在收到Broker返回的傳送是否成功資訊後,會觸發該函式,並呼叫ProducerEvent物件的onSendMsg()函式,向呼叫者傳送成功與否結果。

成功則返回呼叫者RecordMetadata資訊(BrokerServer中的資料offset,Partition位置ID,Topic主題)

失敗者返回呼叫者原始資料資訊,便於日後恢復。

ProducerEvent介面物件

onSendMsg()

為呼叫者提供的回撥介面,呼叫者在註冊後,即可重寫onSendMsg()函式,以便接到通知後,處理當前事件(傳送資料成功與否)狀態。

3.3.2 KfkConsumer物件:資料消費者物件,封裝了關於資料接收的相關功能。

介面函式/子物件

說明

KfkConsumer()

建構函式中需要呼叫者提供Zookeeper叢集的Ip,Port等資訊。(即將推出的Kafka0.9.X版本將支援直連Broker叢集的機制)

該物件繼承至Thread物件,為執行緒物件。

connect()

配置Zookeeper連線相關屬性,並連線Zookeeper伺服器。

run()

執行緒主函式,該函式將啟動Kafka訊息泵等待Broker的訊息到來。

訊息到來後,將呼叫KfkMsg物件對二進位制序列化資訊進行還原物件操作(KfkMsg將對序列化資料進行反序列化操作,並重新還原原始物件操作)。

物件還原後,將呼叫呼叫者註冊的回撥介面,將物件傳出。

close()

關閉Consumer與Broker,Zookeeper的Socket連線。

ConsumerEvent接收回調物件

onRecvMsg()接收回調函式

為呼叫者提供的回撥介面,呼叫者在註冊後,即可重寫onRecvMsg()函式,以便接到通知後,收取物件或處理當前事件。

3.3.3 KfkMsg物件:資料訊息物件,封裝了資料物件的序列化/反序列化操作,構造多種型別的傳送物件,封裝傳送協議等操作。

介面函式/子物件

說明

MsgBase物件

訊息包基類,可以在Consumer接到資料訊息後,形成多種物件的反序列化多型性。

MsgObject物件

serializeMsg()序列化函式

deserializeMsg()反序列化函式

針對Object資料的序列化和反序列化操作,及訊息體封裝,通訊協議構造等操作。

MsgByteArr物件

serializeMsg()序列化函式

deserializeMsg()反序列化函式

針對Byte[]資料的序列化和反序列化操作,及訊息體封裝,通訊協議構造等操作。

MsgFile物件

serializeMsg()序列化函式

deserializeMsg()反序列化函式

針對二進位制檔案的序列化和反序列化操作,及訊息體封裝,通訊協議構造等操作。

getMsgType()函式 

負責對Consumer接收的序列化資訊進行首次協議解析,判斷物件型別(Object,File,byte[])之後構造對應的MsgXXX物件,以便使呼叫者進行反序列化多型功能。

3.3.4 SerializeUtils物件:序列化操作工具類,完成在Jar包內部對外部物件的序列化/反序列化基礎從操作。

介面函式/子物件

說明

deserialize()函式

將序列化後的二進位制陣列byte[]還原成原始Object.

由於如果使用預設的ObjectInputStream物件進行反序列化操作,在Jar內將無法找到外部呼叫者定義的物件名,也即無法反序列化成功,報無法找到外部物件的異常。

所以必須重寫resolveClass()函式,載入當前執行緒範圍內的Class上下文。

Serialize()函式

將Object序列化成二進位制陣列,byte[]。

3.3.5 呼叫者Web框架部署:

KfkProducer部署:

部署要點

說明

1.註冊傳送訊息回撥函式

在WEB框架中的Application_OnStart()事件中向Jar註冊傳送訊息回撥函式。並重寫onSendMsg()回撥介面,用於接受傳送成功/失敗訊息,傳送失敗後,可以在Web框架中針對返回的原始資料資訊做備份/恢復處理。

2.建立與Broker之間的連線

在WEB框架中的

Application_OnStart()事件中呼叫KfkProducer 

connect()函式,連線遠端Broker。

3.將KfkProducer傳入框架

經過前兩步操作後,我們已經順利建立KfkProducer物件,現在我們需要把該物件傳入Web框架中後續頁面處理類中,以方便呼叫其send()函式進行資料傳送。

在Play中我們使用了cache物件機制,可以在Play Web App全生命期內獲得KfkProducer物件例項。

4.關閉與Broker之間的連線

在WEB框架中的Application_OnStop()事件中呼叫KfkProducer的close()函式,關閉遠端Broker連線。

KfkConsumer部署:

部署要點

說明

1.註冊傳送訊息回撥函式

在WEB框架中的Application_OnStart()事件中向Jar註冊訊息接收回調函式。並重寫onRecvMsg()回撥介面,用於接受來自Broker的資料資訊。

在onRecvMsg()函式中,還需針對傳入的Object物件進行instanceof比對操作,區分特定物件。

2.註冊需要接收的Object型別

向Jar包中註冊需要接收的物件型別,比如本應用需要接收(UserInfo,CompanyInfo,ProdcutInfo等物件)。

註冊後,來自Broker的廣播訊息將被Jar包過濾,只返回呼叫者所需的物件資料。

3.建立與Zookeeper(Broker)之間的連線

在WEB框架中的

Application_OnStart()事件中呼叫KfkConsumer 

connect()函式,連線遠端Zookeeper/Broker。

4.啟動訊息泵執行緒

經過前兩步操作後,我們已經順利建立與Zookeeper/Broker建立連線。

我們需要啟動訊息泵來收聽訊息的到來,這裡需要呼叫KfkConsumer物件的start()函式啟動訊息泵執行緒常駐記憶體。

4.關閉與Zookeeper之間的連線

在WEB框架中的Application_OnStop()事件中呼叫KfkConsumer的close()函式,關閉遠端Zookeeper/Broker連線。

五. 未來Kafka中介軟體

目前該中介軟體只完成了初級階段功能,很多功能都不完善不深入,隨著應用業務的拓展及Kafka未來版本功能支援,。以Kafka訊息中介軟體為中心的大資料處理平臺還有很多工去實現。

一般在網際網路中所流動的資料由以下幾種型別:

•需要實時響應的交易資料,使用者提交一個表單,輸入一段內容,這種資料最後是存放在關係資料庫(Oracle, MySQL)中的,有些需要事務支援。

•活動流資料,準實時的,例如頁面訪問量、使用者行為、搜尋情況等。我們可以針對這些資料廣播、排序、個性化推薦、運營監控等。這種資料一般是前端伺服器先寫檔案,然後通過批量的方式把檔案倒到Hadoop(離線資料分析平臺)這種大資料分析器裡面,進行慢慢的分析。

•各個層面程式產生的日誌,例如http的日誌、tomcat的日誌、其他各種程式產生的日誌。這種資料一個是用來監控報警,還有就是用來做分析。

謝謝觀賞!

注:基於全球開源共享理念,本人會分享更多原創及譯文,讓更多的IT人從中受益,與大家一起進步!

基因Cloud 原創,轉發請註明出處

[email protected] (工作繁忙,有事發郵件,QQ不加,非要事勿擾,多謝!)

2015 / 06 / 14


相關推薦

kafka專案例項

http://www.cnblogs.com/darkprince/p/5114425.html 開發Kafka通用資料平臺中介軟體 (含本次專案全部程式碼及資源) 目錄: 一. Kafka概述 二. Kafka啟動命令 三.我們為什麼使用Kafka 四. Kafka資

Kafka基礎實戰:消費者和生產者例項

package kafka.consumer.partition; import kafka.api.FetchRequest; import kafka.api.FetchRequestBuilder; import kafka.api.PartitionOffsetRequestInfo;

Kafka基礎實戰:消費者和生產者實例

消費者 12.1 實戰 tof star inter 傳遞 默認 參數調優 一、Kafka消費者編程模型 1.分區消費模型 分區消費偽代碼描述 main() 獲取分區的size for index =0 to size crea

kafkakafka框架介紹(消費者篇):

本人菜雞,正在努力學習,記錄知識以備後患! 該文章承接上文(kafka系列),暫有兩篇: 【kafka】一、kafka框架介紹(生產者篇):https://blog.csdn.net/lsr40/article/details/84029034 【kafka】二、kafka框架介紹(消費

Kafka學習——Kafka 基本概念——訊息批次主題分割槽borker消費群組等

Kafka 基本概念 訊息:類似於資料庫的記錄,由位元組陣列組成,訊息裡的資料沒有特別的格式或含義。訊息可以有一個可選的元資料(鍵),主要是當以一種可控的方式寫入不同的分割槽時,需要用到。 批次:用於提高效率,將訊息分批次寫入kafka,批次也就是一組訊息,但這些訊息屬於同一主題

kafka訊息與同步機制

如上圖所示:Producer根據指定的partition方法(預設round-robin、hash等),將訊息釋出到指定topic的partition裡面;kafka叢集接收到Producer發過來的訊息後,將其持久化到硬碟,並保留訊息指定時長(可配置),而不關注訊息是否被消費;Consume

kafka系列 kafka manager的安裝和使用

1. Yahoo kafka manager介紹 專案地址:https://github.com/yahoo/kafka-manager Requirements: Kafka 0.8.1.1 or 0.8.2.* sbt 0.13.x Java 8+ Kafka Mana

ionic+cordova混合開發app【建立專案

1、建立專案 1、cmd進入專案存放的位置 2、開啟ionic官網進入專案建立demo示例依照步驟執行命令列建立專案: 官網地址:http://ionicframework.com/docs//intro/tutorial/ ionic start 專案名稱 tabs 其中專案名稱表示你要給自

springboot系列springboot專案搭建

一、maven構建專案 1、訪問http://start.spring.io/ 2、選擇構建工具Maven Project、Spring Boot版本2.1.1以及一些工程基本資訊,可參考下圖所示: 3、點選Generate Project下載專案壓縮包 4、解壓後,使用idea,

Angular專案建立安裝啟動

1.專案建立,進入預先存放專案的路徑,命令列執行 ng new ProjectName 建立成功後的專案 2.專案安裝,進行專案中執行命令 npm install  3. 專案執行,執行命令 ng serve 4.檢視開啟的頁面,每個人版本可能不一樣,頁面開啟的效果也不一樣。

Redis筆記(Redis單例項到叢集)

Redis 部署方案單節點預設情況下Redis 為單示例模式,安裝簡單,使用也便捷. 生產環境中存在單節點問題,受限於單機的記憶體,不具備擴充套件的能力。Redis 安裝1.下載安裝包https://redis.io 下載最最新版本2.解壓縮tar -zxf redis-3.

angular入門(四angularJS專案例項開發

之前已經講過angularJS的基礎知識和專案開發流程了,現在開始例項展示吧~下面要講的這個例項呢,其實網上有,只是現在我以自己的角度和認知來解說一下,希望對你有幫助。 專案名稱:AngularJS模擬拉勾網單頁應用 效果圖如下: 以上就是這次例項的所有

【Docker】基於例項專案的叢集部署()部署專案例項介紹與搭建

部署專案簡介 我們要部署的專案是人人網的一個基於前後端分離的專案:renren-fast。 你可以在這裡對該專案進行下載,並對相關介紹文件進行了解: https://www.renren.io/community/project https://www.renren.io/guide

springboot專案的簡單使用之:定時任務

分鐘(0~59) 小時(0~23) 天(月)(0~31,但是你需要考慮你月的天數) 月(0~11) 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) 7.年份(1970-2099)其中每個元素可以是一個值(如6),一個連續區間(9-12),一個間隔時間

Angular 6整合Spring Boot 2,Spring Security,JWT和CORS系列:Angualr專案連線heroapi專案的增刪改查介面

Angular官方樣例Tour of Heroes通過angular-in-memory-web-api來模擬實現遠端呼叫對hero進行增刪改查,本節對其修改呼叫上一節實現的介面。 二、下載Angular官方樣例程式碼 三、安裝依賴包,在專案所在資料夾的控制檯(或cm

Scrapy學習()安裝及專案結構

一、安裝 1、安裝pywin32,下載地址:https://sourceforge.net/projects/pywin32/files/pywin32/ 我選擇的是Build 221,點進去,根據自己電腦的python版本下載對應的版本 下載下來後,直接執行exe檔案,無腦下一步,直至安裝完成

多執行緒實現簡單的socket通訊例項(TCP)

1.伺服器端 import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 類功能描述:先啟動伺服器端,再啟動客戶端 * * @author:*** * @createTime:2018/

【hessian】 servlet的hessian例項

前言: hessian介紹可以看第一篇博文: https://blog.csdn.net/qiaziliping/article/details/81069265 hessian服務端 1、java專案映入hessian的jar包,maven專案直接配置pom檔案 2、

專案知識點彙總】JNI程式碼編譯方式camke 和 ndk 方式 -- Android Studio 操作

一、介紹 Android Studio 編譯JNI程式碼有兩種方式:cmake 和 ndk 方式 使用感受: 1、cmake方式會受到所用Android sdk版本的影響,主要是ndk的版本影響,沒有深入去探究原理 2、ndk方式可以跨Android sdk 版本執行

elastic-job 專案打包

上一篇:elastic-job、elastic-job-lite-console使用案例 1、pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/P