Что делает инфраструктура удаленного актера, если пытается написать клиенту, которого больше нет? - PullRequest
10 голосов
/ 29 июня 2009

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

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

1 Ответ

1 голос
/ 03 августа 2009

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

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

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

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

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

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

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

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

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

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

...