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

标签 java rest spring-boot

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

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

问题

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

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

(我已经检查过,但在之前的任何帖子中都没有找到任何此类性质的答案。)

最佳答案

Which HTTP verb to use to trigger publication of Kafka messages?

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

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

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

The purpose of distinguishing between safe and unsafe methods is to allow automated retrieval processes (spiders) and cache performance optimization (pre-fetching) to work without fear of causing harm.

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

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

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

Online opinion about [REST] seems to be divided.

REST 深受 Martin Fowler 所说的 Semantic Diffusion 的影响。 .

Semantic diffusion occurs when you have a word that is coined a person or group, often with a pretty good definition, but then gets spread through the wider community in a way that weakens that definition. This weakening risks losing the definition entirely - and with it any usefulness to the term.

RESTarchitectural style ;使用该样式构建的引用应用程序是 World Wide Web .

The only other open question which remains is, whether REST is the right way to trigger a job

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

类(class)用马。

关于java - 使用哪个 HTTP 动词来触发 Kafka 消息的发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56770475/

相关文章:

java - Java 中是否可以仅在一个输出中显示 for 循环的结果?

java - 借鉴Java重量级swing组件

java - 双链表删除

java - 如何找到 trie 中最长的单词?

java - 如何获取 Spring REST 文件下载以返回 404?

java - 如何将 JMeter 中测试套件的所有响应保存在一个文件中?

java - 如何编写表示带有子对象的json对象的java类?

c# - ServiceStack 嵌套数组错误 : KeyValueDataContractDeserializer: Error converting to type: Type definitions should start with a '{'

java - 如何重新启用对 Spring Boot Health 端点的匿名访问?

spring-boot - OAuth2 | ClientCredentialsResourceDetails |弃用