Написание приложений с актерами Scala на практике

Сейчас я написал несколько приложений с использованием актеров scala, и мне интересно, как люди подходили или справлялись с некоторыми проблемами, с которыми я столкнулся.

Изобилие классов сообщений или!?

У меня есть актер, который реагирует на действия пользователя и должен что-то вызвать. Скажем так react с сообщением UserRequestsX(id), Постоянная проблема, с которой я сталкиваюсь, заключается в том, что из-за того, что я хочу модулировать свои программы, один актер сам по себе не может выполнить действие без привлечения других актеров. Например, предположим, что мне нужно использовать id Параметр для получения набора значений, а затем их необходимо удалить через какой-либо другой субъект. Если бы я писал обычную программу на Java, я мог бы сделать что-то вроде:

public void reportTrades(Date date) {
    Set<Trade> trades = persistence.lookup(date);
    reportService.report(trades);
}

Что достаточно просто. Однако, используя актеров, это становится немного болезненным, потому что я хочу избежать использования !?, Один актер реагирует на ReportTrades(date) сообщение, но оно должно спросить PersistenceActor для торгов, а затем ReportActor сообщить о них. Единственный способ, который я нашел, это сделать:

react {
    case ReportTrades(date) =>
       persistenceActor ! GetTradesAndReport(date)
}

Так что по моему PersistenceActor У меня есть блок реагирования:

react {
    case GetTradesAndReport(date) =>
       val ts = trades.get(date) //from persietent store
       reportActor ! ReportTrades(ts)
}

Но сейчас у меня 2 проблемы:

  1. Мне нужно создать дополнительные классы сообщений для представления одного и того же запроса (например, "сообщить о сделках"). На самом деле у меня есть три в этом сценарии, но у меня может быть гораздо больше - становится проблемой отслеживать эти
  2. Как мне назвать первое и третье сообщение ReportTrades? Смешно называть их обоих ReportTrades (или если я это сделаю, я должен поместить их в отдельные пакеты). По существу нет такой вещи, как overloading класс по val тип.

Я что-то упускаю? Могу ли я избежать этого? Должен ли я просто сдаться и использовать !? Используют ли люди какую-то организационную структуру, чтобы уточнить, что происходит?

2 ответа

Решение

Для меня ваш ReportTrades сообщение смешивает два разных понятия. Одним из них является запрос, заказ является ответом. Они могут быть названы GetTradesReport(Date) а также SendTradesReport(List[Trade]), например. Или, может быть, ReportTradesByDate(Date) а также GenerateTradesReport(List[Trade]),

Есть ли возражения против использования reply? Или мимоходом trades вокруг? Если нет, ваш код, вероятно, будет выглядеть

react {
  case ReportTrades(date) => persistenceActor ! GetTrades(date)
  case Trades(ts) => // do smth with trades
}

а также

react {
  case GetTrades(date) => reply(Trades(trades.get(date)))
}

соответственно.

Другие вопросы по тегам