【问题标题】:Send user activities to external service from java spring microservice从 java spring 微服务将用户活动发送到外部服务
【发布时间】:2021-12-24 20:29:43
【问题描述】:

我正在扩展功能正常的 web 应用程序的后端(微服务)以添加新功能。 请求的一项更改是记录所有用户活动的能力。我已经设置了一个利用 slf4j 的日志记录设施,但是我需要将它发送到 json 中的另一个服务,例如
{活动:[{用户名:...,活动类型:...},...]}
对我来说最简单的方法是在完成前端调用的 API 请求后一次发送一个活动。
我对性能表示怀疑,因为对于我的微服务的每次 api 调用,我都必须调用外部的。您是否发现此解决方案存在问题?
我的另一个想法是批量处理每个会话(在内存中)单个用户的所有活动,并在会话结束时将其发送到服务,减少调用,对用户的影响可能更小,但是对于这个解决方案(如果可行)我不知道从何下手,能指点一下吗?
另外我决定不在这个微服务的数据库上维护这些用户活动信息,因为我对它们没有用,这是一个错误吗? 任何提示都表示赞赏。

【问题讨论】:

  • 让我检查一下我是否理解正确。您是否有一个单独的微服务仅用于日志记录?您如何存储此类日志,或者根本不存储它们?
  • 听起来更像是分析。您可以通过写入队列系统并从另一个微服务进行实际发送来将此功能与您的应用程序分离。
  • 是的,用于分析。正常的操作日志(错误、调用)未正确存储在 cloudwatch 上,但我没有开发应用程序的那部分。 @slauth 另一个微服务就是为了这个?是不是有点矫枉过正?

标签: java spring spring-boot microservices


【解决方案1】:

为每个此类事件添加传出 HTTP 调用可能会导致性能问题,当然这也取决于我们服务的负载。您还需要考虑如何优雅地处理错误(超时和非 2xx 响应)。

在会话之后进行批量更新也可能会出现问题。您将需要维护一个事件列表,并确保再次优雅地处理此列表以应对所有潜在的异常

首先要给出一些指示,将其视为一种审计日志记录模式场景,至少我在阅读所需功能时是这样认为的:

请求的一项更改是记录所有用户活动的能力。

首先要了解应该如何使用/阅读这些日志。然后尝试找到简单的解决方案。例如,您可以简单地将所有活动记录在一个单独的日志文件中,并将您的日志框架(例如 log4j2 或 logback)配置为使用 json 作为格式。

另一种方法是将每个活动存储在单独的数据库表中。然后您可以添加一个 API 来读取此信息或使用一些后台进程与外部服务同步。

正如另一条评论中提到的,您还可以使用消息传递系统并为每个操作发送一个事件。

每种方法都有自己的取舍。

【讨论】:

    【解决方案2】:

    我不会把它复杂化太多。我会调用外部 API 进行异步记录,这样 API 的调用者就不会因为您同时调用另一个服务而遭受额外的请求时间。对于这样一个简单的主题,这将是我最初的方法。

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 2013-02-08
      • 2022-10-02
      相关资源
      最近更新 更多