2017-08-17 32 views
0

我目前使用apache駱駝來消費SQS消息,一切都工作正常。Apache Camel - 基於主體的聚合消息

作爲一個項目的一部分,我在上載文件時使用S3通知事件。這些文件上傳到一個可預測的S3密鑰 - (<type>/<account-id>/<id>/<file>)

處理時,我使用camel將消息聚合到單個交換中(等待10條消息或1秒後超時)。我想知道,但是,有沒有基於S3進行聚合的方法 - 例如,具有相同類型或ID的聚合消息。

從我從閱讀駱駝文檔中得知,有許多方法可以查詢Json有效負載或標頭值 - 這是一種可能的方法(因爲S3事件通知是Json消息,並且根據AWS文檔中的PUT操作只會生成一個記錄條目)?或者我需要實現自己的聚合器?

添加一點上下文 - 我有一個服務,收集數據,並上傳數據到S3。然後,另一項服務會在收到通知時下載此數據,並處理該數據並上傳到另一個存儲桶。如果我可以聚合S3通知,我可以合併數據並上傳它,減少上傳量和API調用等。

回答

1

如果您使用camel-aws s3組件,則可以訪問/獲取S3密鑰消息的CamelAwsS3Key標題,您不需要查詢正文,但需要從S3鍵中提取所需的字段。

+0

是的,我檢查了S3組件,我遇到的問題是我無法刪除處理的文件(其他應用可能需要它),並且需要跟蹤輪詢之後已經處理了哪些文件。 – KingTravisG

+0

該組件的一個參數,禁止刪除處理的文件:'deleteAfterRead = false'。 「需要跟蹤哪些文件已經被處理」是什麼意思?如果你的意思是過濾掉重複,那麼你可以使用一個[idempotent repository](http://camel.apache.org/idempotent-consumer.html)和'CamelAwsS3Key'作爲關鍵字。 – mgyongyosi

+0

是的,文件將被保存備份和其他應用程序來處理 - 存儲庫看起來像一個解決方案,但我試圖避免額外的基礎設施等,並會擔心隨着時間的推移性能。如果沒有必要保留這些文件,這可能是最好的解決方案(因爲我已經使用駱駝SQS我也有一些經驗,這是一個獎金)。 – KingTravisG

0

雖然不是最好的或最通用的解決方案,我沒有找到一個方法來得到這個工作 -

我簡單補充說,被傳遞到聚合之前調用的額外的處理器。處理器簡單地檢查事件記錄(因爲我正在監聽來自S3的PUT事件,根據AWS文檔,應該只有一條記錄),並在消息上設置標題。

聚合器則能夠基於這些頭(簡單S3型S3-帳戶-IDS3-ID),以交流結合起來。