NodeJS process.pid одинаков для всех экземпляров сервера - PullRequest
0 голосов
/ 18 января 2019

Для некоторого серверного кода, над которым я работал, я создавал очереди сообщений и нуждался в уникальных именах. Имена были построены с использованием нескольких элементов окружения, а последний элемент - process.pid. Весь наш серверный код упакован в контейнер Docker, и этот контейнер запускается на разных экземплярах сервера в разных регионах. Рассматривая операторы журнала, мы заметили, что значения pid были одинаковыми на обоих экземплярах нашего сервера в каждом регионе, где он был развернут. Я понимаю, что образы Docker являются клонами друг друга, и мой парень из DevOps говорит, что тогда они должны быть одинаковыми, но, учитывая, что наши числа pid были в диапазоне, равном 65xx, мне трудно поверить, что наши экземпляры процесса приложения закончились одинаковые номера. Другая странная вещь здесь - это то, что значения pid были общими только для данного региона AWS. Таким образом, наши экземпляры США-Восток разделили один пид, а наши экземпляры США-Запад разделили другой. Два числа были близки, может быть, что-то вроде 6529 и 6631. Я думаю, что мой вопрос заключается в том, как создается pid, потому что способ, которым я думаю, что он будет создан, должен быть ошибочным.

1 Ответ

0 голосов
/ 18 января 2019

Каждый контейнер работает в своем собственном пространстве процесса. Основной процесс контейнера (его ENTRYPOINT, если он был объявлен, или его CMD, если нет) всегда имеет идентификатор процесса 1 (с соответствующими правами и обязанностями).

В очень типичном случае, когда у вас есть контейнер Node, у которого Dockerfile заканчивается чем-то вроде CMD ["npm", "start"] Я бы ожидал, что сообщаемый pid всегда будет очень маленьким числом, таким как 1 или 2. Если вы введете слои, такие как выделенный init процесс или многопроцессный супервизор или сложная настройка точки входа, я могу видеть, что она выше; но часто следует ожидать, что пространство идентификатора процесса будет начинаться с 1, и при запуске контейнера будет выполняться согласованный набор вещей, использующих постоянное число пидов, и вы не должны удивляться, увидев, что процесс сервера имеет очень согласованный ID процесса.

(Попробуйте docker exec ... ps -e на любом запущенном вами контейнере; вероятно, вы увидите однозначные идентификаторы процессов в каждом контейнере.)

...