【发布时间】:2021-11-21 20:42:30
【问题描述】:
我对 Scala 和 Akka Stream 有点陌生,我试图从 websocket 获取 JSON 字符串消息并将它们推送到 Kafka 主题。
目前我只处理“从 ws 获取消息”部分。
来自 websocket 的消息如下所示:
{
"bitcoin":"6389.06534240",
"ethereum":"192.93111286",
"monero":"108.90302506",
"litecoin":"52.25484165"
}
我想将此 JSON 消息拆分为多条消息:
{"coin": "bitcoin", "price": "6389.06534240"}
{"coin": "ethereum", "price": "192.93111286"}
{"coin": "monero", "price": "108.90302506"}
{"coin": "litecoin", "price": "52.25484165"}
然后将这些消息中的每一个推送到一个 kafka 主题。
这是我目前取得的成就:
val message_decomposition: Flow[Message, String, NotUsed] = Flow[Message].mapConcat(
msg => msg.toString.replaceAll("[{})(]", "").split(",")
).map( msg => {
val splitted = msg.split(":")
s"{'coin': ${splitted(0)}, 'price': ${splitted(1)}}"
})
val sink: Sink[String, Future[Done]] = Sink.foreach[String](println)
val flow: Flow[Message, Message, Promise[Option[Message]]] =
Flow.fromSinkAndSourceMat(
message_decomposition.to(sink),
Source.maybe[Message])(Keep.right)
val (upgradeResponse, promise) = Http().singleWebSocketRequest(
WebSocketRequest("wss://ws.coincap.io/prices?assets=ALL"),
flow)
我正在获得预期的输出 Json 消息,但我想知道我是否可以用更“Akka-ish”的风格编写这个生产者,比如使用 GraphDSL。所以我有几个问题:
- 是否可以使用 GraphDSL 持续使用 WebSocket?如果是的话,你能给我举个例子吗?
- 使用 GraphDSL 使用 WS 是个好主意吗?
- 在将接收到的 Json 消息发送到 kafka 之前,我是否应该像我一样分解接收到的 Json 消息?还是最好按原样发送以降低延迟?
- 在向 Kafka 生成消息后,我打算使用 Apache Storm 来使用它,这是个好主意吗?还是我应该坚持使用 Akka?
感谢您阅读我,问候, 阿雷斯
【问题讨论】:
标签: scala apache-kafka akka streaming akka-stream