W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
事件循環(huán)在任務之間編排讀取和處理消息,檢查點,窗口和刷新指標。
默認情況下,Samza 在每個容器中使用單個線程來運行任務。這適合于 CPU 綁定的工作; 要獲得更多的 CPU 處理器,只需添加更多的容器。單線程執(zhí)行還簡化了共享任務狀態(tài)和資源管理。
對于 IO 綁定作業(yè),Samza 支持同步和異步任務的更細微的并行性。對于同步任務(StreamTask 和 WindowableTask),可以通過配置內(nèi)置線程池 job.container.thread.pool.size 來調(diào)度它們并行運行。這適合于阻塞 IO 任務方案。對于異步任務( AsyncStreamTask ),您可以進行異步 IO 調(diào)用,并在完成后觸發(fā)回調(diào)。Samza 提供的最佳并行度在一個任務內(nèi),由task.max.concurrency 配置。
最新版本的 Samza 是線程安全的。您可以安全地訪問任務線程中的鍵值存儲,寫入消息和檢查點偏移量的作業(yè)狀態(tài)。如果您在任務之間共享其他數(shù)據(jù),例如全局變量或靜態(tài)數(shù)據(jù),則如果可以通過多個線程并發(fā)訪問數(shù)據(jù),例如 StreamTask 在配置的線程池中運行多個線程,則不會線程安全。對于任務中的狀態(tài)(如成員變量),Samza 保證進程,窗口和提交的相互排他性,因此這些操作之間不會有并發(fā)的修改,任何來自一個操作的狀態(tài)變化都將完全可見。
容器可能有多個SystemConsumers用于消耗來自不同輸入系統(tǒng)的消息。每個 SystemConsumer 在其自己的線程上讀取消息,但將消息寫入共享進程內(nèi)消息隊列。容器使用此隊列將所有消息匯總到事件循環(huán)中。
事件循環(huán)如下:
容器在循環(huán)中進行,直到它被關閉。
事件循環(huán)的語義在運行同步任務和異步任務時有所不同:
在這兩種情況下,任務中的默認并發(fā)性為1,這意味著每個任務處理中最多只有一個未完成的消息。這保證主題分區(qū)中的按順序消息處理。您可以通過將 task.max.concurrency 配置為大于1來進一步增加它。這允許多個未完成的消息由任務并行處理。此選項會增加任務中的并行性,但可能導致無序處理和完成。
在上述任何一種情況下,以下語義都得到保證(對于事件發(fā)生的語義,請參閱此處):
更多詳細信息和示例可以在Samza Async API和多線程用戶指南中找到。
開發(fā)人員可以掛接到 SamzaContainer 的生命周期中的唯一方法是通過標準的 InitableTask,ClosableTask,StreamTask / AsyncStreamTask 和 WindowableTask。在需要添加可插入邏輯以包裝 StreamTask 的情況下,StreamTask 可以被另一個處理自定義邏輯的 StreamTask 實現(xiàn)包裝,然后再調(diào)用到包裝的 StreamTask 中。
一個具體的例子是一組 StreamTask,它們都希望在其 process()方法中共享相同的 try / catch 邏輯。可以實現(xiàn) StreamTask,它包裝原始 StreamTasks,并使用適當?shù)?try / catch 邏輯圍繞原始 process()調(diào)用。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: