Что делает инфраструктура удаленного пользователя, если вы пытаетесь написать клиенту, которого больше нет?

У меня есть сервер, который использует инфраструктуру удаленных участников для связи с несколькими клиентами. Как упоминалось в этом вопросе, у меня проблемы с отслеживанием, когда клиент исчезает. Поэтому мой сервер по-прежнему пытается отправить сообщения несуществующим клиентам.

  • Это проблема? (Я не вижу никаких исключений, но я предполагаю, что будут проблемы с памятью, если мой сервер долговечен)
  • Как я могу обнаружить, что сообщение отправляется клиенту, больше не прослушивается? (Если я хочу реализовать некоторую очистку соединения)

Ответ 1

Хорошо, я рискну кое-что здесь.

отказ от ответственности: несмотря на то, что вы прочтете ниже, вы можете начать здесь.

Я не знаком с scala, но он использует аналогичные принципы для Erlang, и я чувствую себя немного комфортно там. Однако то, что меня пугает в связи с вашим вопросом, имеет мало общего с этим. Но больше с отношениями клиент-сервер, которые вы, кажется, устанавливаете.

По определению сервер не будет отправлять сообщения клиенту, если он не получит запрос. То есть класс актера сервера должен быть построен (не обязательно всегда) вокруг операторов case, которые проверяют полученное сообщение и действуют соответственно. Таким образом, в этом контексте клиент существует, и сервер не должен беспокоиться об этом и вместо этого отправлять свое ответное сообщение обычно, потому что клиент просто сделал свое присутствие с запросом.

Итак, если ваш сервер по-прежнему пытается отправлять сообщения клиентам, несмотря на то, что они были закрыты, мне кажется, что он пытается отправлять сообщения, несмотря на отсутствие запроса. Это принципиально неверно в контексте отношений клиент-сервер. Сервер должен реагировать только по запросу. В противном случае он берет на себя роль клиента.

В любом случае вы можете (и) определить конец любого сеанса клиент-сервер. Это поможет освободить ресурсы и завершить установленные соединения. Для этого:

  • Ваш клиент-клиент должен отправить сообщение остановки на сервер и завершить его выполнение с помощью любой функции выхода scala для класса актера.

  • При получении сообщения остановки серверный сервер должен не отвечать на клиента. Вместо этого он должен выполнить свою очистку (если есть) и прекратить выполнение аналогично клиенту-актеру.

Таким образом, вы обеспечиваете надлежащее завершение всех вовлеченных сторон и правильное выделение ресурсов.

Надеюсь, это помогло. К сожалению, я не знаком с scala. В противном случае я мог бы ввести код. Но эта ссылка должна помочь, надеюсь.