Шаблон журнала событий в Scala
Все наши сервисы написаны на Scala. В основном мы пишем чистый функционал Scala, используя Cats.
Я пытаюсь выяснить, есть ли шаблон проектирования в Cats или Scala в целом, который я могу использовать для разработки EventLogger.
Этот eventLogger должен собирать "события" (значения простых ключей), когда запрос проходит через логику. В конце запроса я хочу записать собранные события в хранилище данных. У нас уже есть неявный параметр context, который передается всем методам. Я мог бы добавить этот EventLogger в мой класс Context, и он имел бы доступ к журналу событий из большинства частей моего кода. Теперь я пытаюсь понять, как спроектировать сам EventLogger, не используя изменяемую коллекцию.
Раньше я использовал актеров для сбора состояний в прошлом, чтобы управлять переходящими состояниями. Я бы предпочел не вводить Акку в наш classpath только для этого.
1 ответ
Как говорит @AndreyTyukin, Writer
будет хорошо работать здесь.
Вы могли бы сделать что-то вроде:
object EventLogger {
type Event = (String, String)
def log(event: Event): Writer[Vector[Event], Unit] =
Writer.tell(Vector(event))
}
И тогда вы можете использовать это так:
// Example usage
for {
something <- Writer.value(myFunc(arg))
_ <- EventLogger.log("function_finished" -> "myFunc")
somethingElse <- Writer.value(myFunc2(arg2))
_ <- EventLogger.log("function_finished" -> "myFunc2")
} yield combine(something, somethingElse)
В конце этого у вас будет какая-то Writer[Vector[Event], ?]
значение где ?
может быть значение, которое вас интересует, и Vector[Event]
это все твое Event log
данные готовы для вас, чтобы сделать что-то с.
Также обычно Writer
не будет единственным контейнером, который вы хотите использовать. Вы, вероятно, хотите исследовать Monad Transformers, чтобы складывать контейнеры или что-то вроде Eff.