首页 > 解决方案 > 使用哪个 HTTP 动词来触发 Kafka 消息的发布

问题描述

背景 我需要为我们团队中的开发人员和产品所有者实现一种方法,以便能够在查询我们的 Spring Boot 应用程序的数据库后触发重新发布一些 Kafka 消息。将查询数据库以获取数据,但不会执行任何修改。因此该操作对应用程序持有的资源没有影响。

潜在的解决方案 我正在考虑实现一个 REST 端点来实现这一点。我知道这不是一个通过 REST 实现的好用例,因为应用程序持有的资源没有“状态转移”。所以...

问题

  1. 除了 REST 端点之外,还有其他关于实现此目标的替代方法的建议吗?

  2. 如果我通过 REST 端点实现它,我应该使用哪个 HTTP 动词?

(我已经检查过,在之前的任何 SO 帖子中都没有发现任何此类性质的已回答问题。)

标签: javarestspring-boot

解决方案


使用哪个 HTTP 动词来触发 Kafka 消息的发布?

您可以通过查看 HTTP 方法的语义并决定哪种方法适合您的用例来回答这个问题。

对于这个例子,合理的候选者是GETPOST。(从技术上讲,您可以考虑HEAD,这是一种特殊情况GET——我将在这里忽略它)。

要理解的重要区别是 GET 语义包括safe ; 描述是“有效只读的”,但重要的是它的含义。

区分安全和不安全方法的目的是允许自动检索过程(蜘蛛)和缓存性能优化(预取)工作,而不必担心造成伤害。

自动检索意味着GET即使没有业务动机,您也可以看到请求。如果没问题,那么使用 GET 就可以了——当请求通过不可靠的网络发送时,它甚至有一些优势。

另一方面,如果重新发布是“昂贵的”或者只能“故意”进行,那么POST这是一个更合适的选择。

在浏览器中的网页上下文中想象这一点可能会有所帮助。如果您通过a 元素提供访问权限,则允许浏览器通过预取资源来尝试优化用户体验。另一方面,使用表单 元素method: POST不会被预取,因为兼容的浏览器知道请求不应该是安全的。

关于 [REST] 的在线意见似乎存在分歧。

REST 深受 Martin Fowler 所说的语义扩散的影响。

当你有一个词是由一个人或一个群体创造的,通常有一个很好的定义,但随后以削弱该定义的方式传播到更广泛的社区时,就会发生语义扩散。这种弱化有可能完全失去定义——随之而来的是该术语的任何用处。

REST是一种架构风格;使用这种风格构建的参考应用程序是万维网

剩下的唯一另一个悬而未决的问题是,REST 是否是触发工作的正确方式

取决于您所面临的限制,以及您的雄心壮志。“每个人”都有可供他们使用的 Web 客户端,因此这是一种将消息从客户端传输到服务器的廉价方式。另一方面,HTTP 请求并不小,并且内置了许多功能,在您的用例中可能只是拖累。

课程用马。


推荐阅读