Взаимодействие компонентов (Actors) происходит по RPC протоколам, и компоненты должны поддерживать определеный набор поведений. Обеспечить поддержку требований в приложении помогает фреймворк.
В какой-то момент engine::balance понимает, что нужно запустить новый
воркер. Slave_t читает поле slave из манифеста, и указанный там путь
запускает с аргументами --app
, --locator,
--endpoint, --uuid
.
Например, так:
relative/path/to/slave --app app-name --locator 1.2.3.4:10053 --endpoint /path/to/unix.sock --uuid aa-bb-bb-cc-cc-cc-dd-dd
После этого engine ждет соедининия на сокет, переданный в endpoint в
течение startup-timeout
. Воркер должен законнетиться на сокет, переданный в endpoint, и отправить
handshake сообщение. После этого воркер считается успешно
поднявшимся. Когда воркер готов обрабатывать входящие сообщения, он
отправляет heartbeat сообщение, и после этого engine начинает
отправлять входящие сообщения в инстанс.
В какой-то момент воркер может понять, что ему нужно завершиться. Чтобы это сделать корректно, он отправляет terminate сообщение рантайму с кодом "все хорошо", после чего может завершить свой процесс. Если воркер после отправки terminate не завершается, рантайм ему отправляет SIGTERM.
В другом случае, когда воркер работает, а cocaine-runtime понимает что
ему нужно завершить определенного воркера, cocaine-runtime отправляет
terminate. Воркер должен в течении terminate-timeout
завершить свою
работу и прислать в рантайм ответный terminate, после чего он может
завершить процесс. После ответного terminate воркера, если воркер не
завершился сам, cocaine-runtime отправляет ему SIGTERM.
Клиент сервиса (а доступ к приложениям происходит через сервис) делает следующие действия:
- Резолвит имя сервиса в адрес ендпоинта (обычно tcp) локаторе.
- Коннектится на ендпоинт сервиса.
- Отправляет и получает сообщения от сервиса.
Соединение к сервису поддерживается. В это время сервис может завершится, рестартовать, или появиться новая версия. Поэтому клиент должен обрабатывать эти ошибки.