Что делает инфраструктура удаленного субъекта, если пытается написать клиенту, которого больше нет?
У меня есть сервер, который использует структуру удаленных актеров для связи с несколькими клиентами. Как уже упоминалось в этом вопросе, у меня возникают проблемы с отслеживанием исчезновения клиента. Следовательно, мой сервер все еще пытается отправить сообщения несуществующим клиентам.
- Это проблема? (Я не вижу никаких исключений - но я предполагаю, что будут проблемы с памятью, если мой сервер будет работать долго)
- Как я могу определить, что сообщение отправляется клиенту, который больше не слушает? (Если я хочу осуществить какую-то очистку соединения)
1 ответ
Хорошо, я рискну чем-то здесь.
Отказ от ответственности: несмотря на то, что вы будете читать ниже, вы можете начать здесь.
Я не знаком со скалой, но она использует принципы, аналогичные принципам Эрланга, и я чувствую себя там несколько комфортно. Однако то, что меня смущает в вашем вопросе, не имеет к этому никакого отношения. Но больше с клиент-серверными отношениями, которые вы, похоже, устанавливаете.
По определению сервер не будет продолжать отправлять сообщения клиенту, пока не получит запрос. Таким образом, класс субъекта сервера должен быть построен (не обязательно всегда) вокруг операторов case, которые проверяют полученное сообщение и действуют соответственно. Таким образом, в этом контексте клиент существует, и сервер не должен беспокоиться об этом и вместо этого отправляет свое ответное сообщение в обычном режиме, потому что клиент только что сообщил о своем присутствии с помощью запроса.
Поэтому, если ваш сервер все еще пытается отправлять сообщения клиентам, несмотря на то, что они были закрыты, мне кажется, что он пытается отправлять сообщения, несмотря на то, что не получил никакого запроса. Это в корне неверно в контексте отношений клиент-сервер. Сервер должен реагировать только по запросу. В противном случае он берет на себя роль клиента.
В любом случае вы можете (и должны) определить конец любого разговора клиент-сервер. Это поможет освободить ресурсы и разорвать установленные соединения. Для этого эффекта:
Ваш клиентский субъект должен отправить сообщение остановки на сервер и прекратить его выполнение любой функцией выхода, реализованной в scala для класса субъекта.
При получении сообщения об остановке субъект сервера не должен отвечать клиенту. Вместо этого он должен выполнить очистку (если таковая имеется) и прекратить выполнение аналогично действующему субъекту клиента.
Таким образом, вы гарантируете правильное прекращение участия всех действующих лиц и правильное освобождение ресурсов.
Я надеюсь, что это помогло как-то. К сожалению, я не знаком с самой Scala. В противном случае я мог бы ввести некоторый код. Но приведенная выше ссылка должна помочь, надеюсь.