【问题标题】:Event Logger Pattern in ScalaScala 中的事件记录器模式
【发布时间】:2018-05-20 06:04:05
【问题描述】:

我们所有的后端服务都是用 Scala 编写的。我们主要使用 Cats 编写纯函数式 Scala。

我试图弄清楚 Cats 或 Scala 中是否有一种设计模式,我可以使用它来设计 EventLogger。

这个 eventLogger 应该在请求流经逻辑时收集“事件”(简单的键值)。在请求结束时,我想将收集到的事件写入数据存储。我们已经有一个“上下文”隐式参数,它被传递给所有方法。我可以将此 EventLogger 添加到我的 Context 类中,它可以从我的大部分代码中访问事件记录器。现在我想弄清楚如何在不使用可变集合的情况下设计 eventLogger 本身。

过去我习惯用 akka actor 来收集状态来管理变异状态。我不希望仅仅为此将 Akka 引入我们的类路径。

【问题讨论】:

  • 为什么不使用WriterT

标签: scala scala-cats


【解决方案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 的东西。

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多