我有一個帶有 Sidekiq 的 Ruby on Rails 容器。
我在應用程式中有一個計劃/cron 作業。正如我們所知,計劃作業在應用程式啟動時注冊。
如果我假設有一天會有很多用戶,我會為應用程式創建多個容器實體,這會導致 Sidekiq 在多個容器上執行嗎?
如果答案是肯定的(在每個容器中執行多個作業),我如何使該作業僅由一個容器執行?
version: '3.8'
services:
thedatabase:
image: postgres:12
volumes:
- ./database:/var/lib/postgresql/data
environment:
POSTGRES_USER: theuser
POSTGRES_PASSWORD: thepass
ports:
- '5432:5432'
networks:
- excnetwork
theapi:
build:
context: ./dex-api
dockerfile: Dockerfile
volumes:
- ./dex-api:/web
env_file:
- ./dex-api/.env
ports:
- "8081:3000"
depends_on:
- thedatabase
networks:
- excnetwork
redis:
image: redis
command: 'redis-server --requirepass "yourpassword"'
volumes:
- ./redis:/var/lib/redis/data
ports:
- '6379:6379'
networks:
- excnetwork
volumes:
database:
dex-api:
redis:
networks:
excnetwork:
driver: bridge
uj5u.com熱心網友回復:
[如果我] 為應用程式創建多個容器實體,這會導致 Sidekiq 在多個容器上執行嗎?
是的; 但是 Sidekiq 足夠聰明,即使有多個工人,每個作業也只運行一次。同樣,如果您使用 Sidekiq 的付費版本及其定期作業,則不應重復它們,因為“領導行程將 cron 作業入隊”(檔案鏈接)。
您沒有描述如何啟動 Rails 和 Sidekiq,但您的 Compose 設定只有一個應用程式容器。您可能會發現將它們分成兩部分很有用,這樣可以更輕松地擴展組件并在計劃作業出現問題時保護 Web 應用程式。在您的 Dockerfile 中,啟動其中一個(我默認使用 Rails 服務器)
ENTRYPOINT ["bundle", "exec"]
CMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"]
在您的 Compose 檔案中,您可以從同一個影像啟動多個容器,command:如果需要,可以覆寫其中的一些容器。
services:
theapi:
build: ./dex-api
env_file:
- ./dex-api/.env
ports:
- "8081:3000"
depends_on:
- thedatabase
- redis
theworker:
build: ./dex-api # <-- same as `theapi`
command: sidekiq # <-- override Dockerfile `CMD`
env_file:
- ./dex-api/.env
depends_on:
- thedatabase
- redis
uj5u.com熱心網友回復:
雖然沒有單一的答案可以解決所有問題,但您可以使用久經考驗的方法。其中之一是將 Sidekiq 放在邊車中。您肯定需要將 Sidekiq 作為單個獨立實體運行。
多容器解決方案還有其他模式,例如大使和配接器,但在這種情況下,sidecar 似乎是最合適的選擇。
在這里閱讀更多:
- https://medium.com/swlh/pattern-sidecars-ambassadors-and-adapters-containers-ec8f4140c495
- Sidecar、Ambassador和Adapter模式的區別
- https://www.weave.works/blog/container-design-patterns-for-kubernetes/
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510053.html
