Scala 如何使用Kafka、Alpakka Kafka、Play Framework和Websocket处理POST请求?

Scala 如何使用Kafka、Alpakka Kafka、Play Framework和Websocket处理POST请求?,scala,websocket,apache-kafka,playframework,alpakka,Scala,Websocket,Apache Kafka,Playframework,Alpakka,假设我有两个卡夫卡主题,request\u topic用于我的帖子请求,而response\u topic用于我的回复 以下是模型: case class Request(requestId: String, body: String) case class Response(responseId: String, body: String, requestId: String) 这是我的套接字处理程序 def socket = WebSocket.accept[String, String]

假设我有两个卡夫卡主题,
request\u topic
用于我的帖子请求,而
response\u topic
用于我的回复

以下是模型:

case class Request(requestId: String, body: String)
case class Response(responseId: String, body: String, requestId: String)
这是我的套接字处理程序

def socket = WebSocket.accept[String, String] { req =>
  val requestId = ??? // Generate a unique requestId

  val in: Sink[String, Future[Done]] = Sink.foreach[String]{ msg =>
    val record = new ProducerRecord[String, Request]("request_topic", "key", Request(requestId, msg))
    val producer: KafkaProducer[String, Request] = ???
    Future { producer.send(record).get }
  }

  // Once produced, some stream processing apps will manage to process request and publish the reponse to response_topic
  // The Request and Response object are linked by the requestId field.

  val consumerSettings = ???
  val out: Source[ConsumerRecord[String, Response], _] = Consumer
    .plainSource(consumerSettings, Subscriptions.topics("response_topic"))
    .filter(cr => cr.value.requestId == requestId)
    .map(cr => someResponseString(cr.value))

  Flow.formSinkAndSource(in, out)
}

def someResponseString(res: Response): String = ???
基本上,对于每个传入的消息,我都会向Kafka发布一个请求对象,然后由一些流处理应用程序(此处未显示)处理该请求,并希望将响应发布回Kafka

我在这里有一些担心:

1-Alpakka Kafka连接器会为每个传入消息创建连接器的新实例,还是在播放运行时使用相同的实例

2-基于单个requestId过滤响应是一个好主意,还是我应该将整个流发送回每个客户机,让他们基于他们感兴趣的requestId过滤响应

3-我每件事都错了吗?(我是Websocket的新手)

提前感谢。

1)取决于您如何配置它。例如,在
in:Sink
正文中,为每条消息创建一个新的
KafkaProducer
。相反,整个应用程序应该有一个生产者

我不确定Akka/Play的线程模型是如何工作的,但大多数web服务器都会为每个传入连接启动一个新线程,线程池中的线程数量最多为固定数量

2) 我认为尽快过滤是首选,同时尽可能多地在服务器端进行过滤。这样可以节省回客户端的带宽

此外,如果您只希望将web服务器上的Kafka数据以一个方向推送到客户端,则可能需要