Java 使用ApacheKafka进行实时消息传递

Java 使用ApacheKafka进行实时消息传递,java,spring-boot,spring-mvc,apache-kafka,Java,Spring Boot,Spring Mvc,Apache Kafka,我们已经在Spring MVC中开发了一个在线考试系统,以及用于离线监考的实时网络摄像头图像捕获和上传,现在客户要求在线或实时监考解决方案,在线监考人将看到在线考生的实时图像,并基于此(如果他/她感觉到任何不当行为)可以向在线候选人发送警告消息 为了从在线监考人向考生发送警告消息,我们正在考虑使用ApacheKafka,因此来自在线监考服务器(SpringBoot)的消息将发送到kakfa服务器,每个考试服务器(SpringMVC)将使用该消息。到目前为止,我们还很清楚,但是在考试服务器上收到消

我们已经在Spring MVC中开发了一个在线考试系统,以及用于离线监考的实时网络摄像头图像捕获和上传,现在客户要求在线或实时监考解决方案,在线监考人将看到在线考生的实时图像,并基于此(如果他/她感觉到任何不当行为)可以向在线候选人发送警告消息

为了从在线监考人向考生发送警告消息,我们正在考虑使用ApacheKafka,因此来自在线监考服务器(SpringBoot)的消息将发送到kakfa服务器,每个考试服务器(SpringMVC)将使用该消息。到目前为止,我们还很清楚,但是在考试服务器上收到消息后,如何在不刷新或不执行从浏览器到考试服务器的REST调用的情况下向特定考生显示该消息?或者是否有其他优雅的方法可以做到这一点


如果您需要在用户屏幕上立即弹出消息,您可能需要设置WebSocket。通过WebSocket,考生的浏览器将建立并保持与考试服务器的连接,考试服务器将能够将消息推送到浏览器

本文对此做了很好的解释:


另请参见

正如您在图表中明确指出的那样,将卡夫卡直接暴露在互联网上并不是一条可行之路,相反,您需要一个中介来分发消息数据。这通常是一个消息代理或理想的实时消息服务,专门为数据的互联网交付而设计。请参见下面的简化图

<>为了保持您的堆栈简单、安全和可扩展性,我强烈建议您在客户端和卡夫卡中间考虑一个中间的面向Internet的消息代理。
整个主题在“

中有非常深入的介绍。您始终可以使用WebSocket打开messagebus并连接到服务器。现在,由于您的候选人正在使用浏览器并联机,因此套接字已连接。你可以随时发布。一旦他们不在线,你需要将消息存储到一个类似于系统的收件箱中,并且套接字再次连接,只需为所有消息提供信息。比如socket.io或sockjs?如果我必须如何使用web套接字,那么为什么要使用kafka?与客户端通过web套接字(如socket.io或sockjs)直接连接到web服务器的体系结构相比,添加额外的kafka层会带来什么好处?如果我必须如何使用web套接字,那么为什么要使用kafka?与客户机通过web套接字直接连接到web服务器的体系结构相比,添加额外的卡夫卡层会带来什么好处?是的,socket.io可能是最著名的,但还有其他一些。使用Kafka的原因是将proctoring服务器与考试服务器分离。这样,当有更多的人参加考试时,你只需要打开更多的考试服务器,他们就可以处理与学生浏览器保持开放连接的任务