使用Spring Boot,Kafka和ReactJS等待后端进程响应

时间:2019-04-06 11:56:53

标签: reactjs spring-boot apache-kafka

我正在使用Spring Boot 2.1.4,Kafka和React作为前端UI。我从UI进行了一个用户注册过程,该过程需要一个后端过程,并且需要完成注册之前的数据。

流程如下:

  1. 前端UI向API发出请求,该API返回令牌并将消息放入请求Kafka队列中
  2. 邮件由后端处理(大约需要1分钟)
  3. 该过程完成后,带有令牌和数据的消息将被写入到Kafka答复队列中,表明该过程已完成

我想要的是前端UI发出初始API请求,该请求立即返回,显示加载屏幕并在注册过程完成后显示就绪消息。

我想到了两个选择:

  1. 将KafkaListener附加到回复队列。出现回复消息后,将响应和令牌存储在数据存储区(例如Redis)中。向UI提供一个API,该API检查数据存储区中的令牌。 UI将每10秒轮询一次此API。如果2分钟后仍然没有响应,则将要求用户稍后再检查。

  2. 在React中使用WebSockets。我以前没有使用过WebSocket,但是我唯一不确定的是如果我有多个注册微服务实例,这会导致客户端/ api通信的任何问题。

有什么建议或其他最佳方式来解决此问题?

1 个答案:

答案 0 :(得分:0)

  
      
  1. 将KafkaListener附加到回复队列。出现回复消息后,将响应和令牌存储在数据存储区(例如Redis)中。向UI提供一个API,该API检查数据存储区中的令牌。 UI将每10秒轮询一次此API。如果2分钟后仍然没有响应,则将要求用户稍后再检查。
  2.   

这将起作用。我只是为了简单起见,将使用内置的RocksDB进行存储。以下是将状态存储公开为可在kafka流之外查询的文档。

https://kafka.apache.org/20/documentation/streams/developer-guide/interactive-queries.html

  
      
  1. 将WebSockets与React一起使用。我以前没有使用过WebSockets,但是我唯一不确定的是如果我有多个注册微服务实例,这会导致客户端/ api通信的任何问题。
  2.   

它可能会引起问题。这取决于注册服务的实施。您将不知道客户端将与哪个注册服务实例建立连接。例如,会话需要在Redis这样的外部数据源中进行管理,否则您将不得不使用支持粘性会话的laod balancer(有点过时的解决方案)。