我目前正在使用 node 和 python 開發一個微服務系統。我們目前正在使用 AWS SQS 來處理佇列上的服務之間的訊息,但是在其中一項服務中,我們向佇列發送訊息,并且同一服務處理該訊息。沒有其他微服務可以處理它。所以我的問題是通過同一應用程式或容器內的事件總線/事件佇列處理內部訊息更好,還是應該通過網路請求將訊息發送到外部服務并由作業人員處理。
- 內箱
Application
|-------------------------------------------------------|
| |
| |---------| Send Message |---------||
| | Main |------------------------------>| Internal||
| | App |<------------------------------| Queue ||
| |---------| Emit Message |---------||
| |
|-------------------------------------------------------|
- 外部佇列
Application
|-----------------|
| |
| | Send Network Message |---------|
| |-------------------------->| External|
| |<--------------------------| Queue |
| | Process Network Message |---------|
| |
|-----------------|
uj5u.com熱心網友回復:
在做出決定之前,我會考慮幾個方面:
- 考慮到內部佇列,如果整個 pod/box 崩潰(無論出于何種原因)會發生什么?從業務和架構的角度來看,丟失存盤在該佇列中的訊息是否可以接受?
- 在您的資料處理作業流程中,延遲是一個重要的向量嗎?如果是,那么它可能是使用內部佇列的一個選項,因為您不會對資料進行處理。如果不是,并且資料一致性更重要,那么外部佇列可能是要走的路。
- 從可擴展性的角度來看,如果內部佇列變得太大怎么辦?最終它可能會填滿盒子/吊艙上的記憶體,但您也可能希望使用其他作業人員將處理延遲保持在某些閾值內(因此您仍然可能最終退出行程)。
- 另外,假設您從佇列中消耗的行程崩潰(出于某種原因),或者它有一個邏輯錯誤,但佇列中仍然有資料,重播它可能具有挑戰性,因為佇列在同一個使用應用程式進行處理。使用外部佇列,您只需插入一個新的作業消費者,它可能在不同的盒子上。
- 從可觀察性的角度來看(消耗/發送/進行中的訊息數量等),使用外部佇列比自己管理所有這些東西要好得多。
TL;DR - 如果您有延遲限制并且佇列用于保存少量快速消耗的訊息,那么使用內部佇列可能是有意義的。否則,(考慮到上述情況),外部佇列是更好的選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/430854.html
