在网页上显示Kafka消息

时间:2018-03-10 18:36:26

标签: javascript java apache-kafka frontend

我有一个带有Tomcat服务器的Java Spring应用程序,可以监听kafka主题。我想在网页上以实时模式显示所有消息。因此,当kafka消息到达后端时,我想在我的网页上看到它。我不知道将kafka消息直接推送到前端并在网页上显示的好方法。有人可以帮我解决一些问题吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我为我的上一个雇主用Java实现了这样的系统,尽管不是Spring / Tomcat。它正在消耗来自Kafka的消息,并在Web套接字上提供它们以在浏览器中显示。我遵循的方法是使用akka-stream-kafkaakka-http来支持Web套接字。这样做的好处是基于akka-streams,这使它很容易适合流数据。 虽然你可以在tomcat中运行的spring应用程序中嵌入akka-http,但它可能不再是最自然的选择,因为spring框架已经拥有了对kafka和websockets的支持。但是,如果您对这两者都不熟悉,那么跳转akka方法可能是最简单的,核心逻辑也沿着这些方向发展(我无法从工作中共享代码,所以只需将它们放在文档中的示例中,未经测试):

public Route createRoute(ActorSystem system) {
  return path("ws", () -> {
    ConsumerSettings<byte[], String> consumerSettings = ConsumerSettings.create(system, new ByteArrayDeserializer(), new StringDeserializer())
      .withBootstrapServers("localhost:9092")
      .withGroupId(UUID.randomUUID().toString()) //this is so that each client gets all messages. To be able to resume from where a client left off in case of disconnects, you can generate in on the client side and pass in the request
      .withProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest")

    return handleWebSocketMessages(
      Flow.fromSinkAndSourceCoupled(
        Sink.ignore(),
        Consumer.committableSource(consumerSettings, Subscriptions.topics("topic1"))
          .map(msg -> TextMessage.create(msg.record().value()))
      )
    );
  }
}

要公开此路线,您可以按照minimalistic example,唯一的区别是您定义的路线需要ActorSystem:

final Http http = Http.get(system);
final ActorMaterializer materializer = ActorMaterializer.create(system);

final Flow<HttpRequest, HttpResponse, NotUsed> routeFlow = createRoute(system).flow(system, materializer);
final CompletionStage<ServerBinding> binding = http.bindAndHandle(routeFlow,
    ConnectHttp.toHost("localhost", 8080), materializer);

将消息发布到websocket后,前端代码将取决于您选择的UI框架,使用来自javascript的消息的最简单代码是:

this.connection = new WebSocket('ws://url-to-your-ws-endpoint');
this.connection.onmessage = evt => { 
  // display the message

要在UI中轻松显示消息,您希望格式变得方便,例如JSON。如果您的Kafka消息已经不是JSON,那么第一个代码片段中的Deserializers就会出现,您可以在Deserializer中将其转换为方便的JSON字符串,或者稍后在Source对象上调用的.map()中执行。 / p>

或者,如果轮询是一个选项,您也可以考虑使用现成的Kafka Rest Proxy,那么您只需要构建前端。