2017-09-05 87 views
1

我有以下設置:許多設備通過HTTP將數據發送到我的後端,其中接收器組件正在運行多個實例。我需要處理數據,然後將其發送給另一個外部合作伙伴,他們需要按時間戳順序輸入此數據。於是我想出了以下結構:Spring集成 - 跨步驟共享鎖定

  1. 有運行,在他們面前的一個負載均衡N個接收機的情況下,讓他們potientially得到所有設備的數據。這些實例通過添加一些信息來處理每個傳入數據,然後將數據放入Redis Sorted Set(每個設備都有一個)。在此之後,他們發送一條消息(通過Redis)有關當前集合中有多少條數據條目。

  2. 有m個處理實例,其任務是將數據發送給外部夥伴。他們收聽接收者發送的消息,如果一個集合內的條目數量大於某個閾值,他們會從隊列中檢索數據,添加一些其他信息,然後將其發送給外部合作伙伴。

我遇到的問題是時間戳順序要求。我有n和m個實例,每個實例運行多個線程。對於所有接收來自接收者的消息的處理實例,我考慮從該集合中檢索數據並將其發送到共享Redis鎖中的外部夥伴以用於與該消息相關聯的隊列(以及相應的設備)。但是目前有多個Spring集成步驟是處理流程的一部分:從隊列中獲取數據 - >將其轉換爲發送 - >通過HTTP出站通道發送。我想過使用第一步獲取的鎖(從隊列中獲取數據)並在最後一步(通過出站通道發送後)釋放的鎖。如果發生錯誤,將在錯誤處理步驟中解除鎖定。

是否有替代品的任何想法?我正在考慮通過剩餘的流發送鎖作爲消息頭的一部分,然後在最後釋放它。

回答

0

由於您提到訂購,您應該考慮在發送給外部合作伙伴之前使用PriorityChannelResequencer對記錄重新排序。 兩者都可以使用共享MessageStore進行配置。