2016-05-17 95 views
4

我的系統中有2個進程P1和P2,通過TCP彼此非常頻繁地進行通信。出於這個原因,它們都被託管在同一個虛擬機上。我正在考慮消除虛擬機,而是將我的系統託管在物理機器的容器中。如果我使用我的系統dockerize,我有兩種選擇:單個容器與多個容器

  1. 容器1包含P1,容器2包含P2。這兩個容器將被鏈接。 P1和P2之間的通信將跨越集裝箱邊界。
  2. 一個容器將包含P1和P2。溝通將保留在容器內。

請親引導我介紹上述2種方法的優缺點。
方法1中通信延遲方面的開銷是多少?

回答

2

一個容器中的幾個進程的主要問題是信號管理:您如何(乾淨地)停止所有您的進程?

這就是「PID 1 zombie reaping issue」,這就是爲什麼,無論何時必須管理多個進程,像phusion/baseimage-docker這樣的基本映像都可以提供幫助。

更常見的問題是微服務解耦:如果P1和P2都是有狀態的並且依賴於另一個,則將它們保留在同一個容器中是有意義的。

什麼是參與通信延遲方面的開銷

這取決於過程所涉及的類型,但由於這兩個過程在同一泊塢窗主機上運行(的開銷很小,即使他們在單獨的容器中)

1

這也是一個縮放問題。如果您希望自動縮放P1,假設P1的用法跨越某個閾值(堆,吞吐量),並且使用單個容器方法,則您可能也會複製P2,儘管這可能不是必需的。

因此,一個容器一個進程,擴展性更好,並提供細粒度的管理(協調)控制。

就延遲而言,它確實取決於容器的部署體系結構。如果兩個容器都託管在同一臺機器上,則延遲將變得微不足道,同時,如果它們位於2個不同的AWS區域中,則會開始產生影響。