rest_REST /使用提要发布事件

2023-12-27 14:40
文章标签 使用 事件 发布 rest 提要

本文主要是介绍rest_REST /使用提要发布事件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

rest

rest

处理事件

当使用多个解耦的服务时(例如,在微服务体系结构中),很有可能需要一种将某种域事件从一个服务发布到一个或多个其他服务的方法。

许多广泛采用的解决方案依赖于单独的基础结构来解决此问题(例如事件总线或消息队列)。

活动提要

解决此问题的另一种方法是使用提要。 RSS或ATOM之类的提要通常用于订阅网页。 每当将新文章发布到订阅的网页时,提要阅读器应用程序(例如,浏览器插件或移动应用程序)都可以将新文章通知用户。 提要阅读器通常会定期轮询提供的提要端点,以查看是否有新文章。

可以使用提要将事件发布到其他服务,而不是将新文章发布到RSS阅读器。 除了用于存储事件(您可能已经拥有)的标准数据库之外,这不需要任何其他基础结构。

RSS和ATOM都是XML格式,因此如果我们要提供JSON API,则不合适。 还有JSON Feed ,类似于RSS和ATOM,但使用JSON。 像RSS和ATOM一样,JSON Feed专注于网站内容,因此,许多(可选)提要和提要项属性对于发布域事件(例如faviconcontent_htmlimagebanner附件)不是很有用。 但是,JSON Feed具有简单的扩展机制,可让我们在Feed中定义自定义字段。 这些字段必须以下划线开头。 如果JSON Feed不能满足您的需求,您还可以提出自己的feed格式,这应该不难。

具有两个已发布域事件的示例JSON Feed可能如下所示:

 {"version" : " https://jsonfeed.org/version/1 " ,"title" : "user service events" ,"feed_url" : " http://userservice.myapi.com/events " ,"next_url" : " http://userservice.myapi.com/events?offset=2 " ,"items" : [{"id" : "42" ,"url" : " http://userservice.myapi.com/user/123 " ,"date_published" : "2020-05-01T14:00:00-07:00" ,"_type" : "NameChanged" ,"_data" : {"oldName" : "John Foo" ,"newName" : "John Bar"}}, {"id" : "43" ,"url" : " http://userservice.myapi.com/user/789 " ,"date_published" : "2020-05-02T17:00:00-03:00" ,"_type" : "UserDeleted" ,"_data" : {"name" : "Anna Smith" ,"email" : "anna@smith.com"}}]}

第一个事件(ID为42 )指示用户资源/ user / 123的名称已更改。 在_data块中,我们提供了一些可能对订户有用的附加事件信息。 第二个事件表明资源/ user / 789已被删除, _data块包含已删除的用户数据。 _type_data没有以JSON Feed格式定义,因此以下划线(JSON Feed扩展格式)开头。

提要属性next_url可用于提供某种分页。 它告诉客户端在当前提要中的所有事件都已处理后,在哪里可以查找更多事件。 我们的提要仅包含两个事件,因此我们告诉客户端使用偏移量参数2调用提要端点以获取下一个事件。

一般注意事项

如果您使用JSON Feed或使用自己的Feed格式,则在构建用于发布事件的Feed时应考虑以下一些常规事项:

提要项是不可变的

提要项表示域事件,它们是不可变的。 必要时,客户可以使用唯一的Feed项目ID来检查他们是否已经处理过Feed项目。

Feed项目订单未修改

提要中项目的顺序不变。 较新的项目会附加到Feed的末尾。

客户应该只能请求到目前为止尚未处理的提要项。

为避免客户需要一遍又一遍地处理所有提要项以查看是否有新项(例如,通过检查date_published项属性),提要应提供一种仅返回新项的方法。 使用JSON Feed时,可以通过next_url属性完成。

下图试图显示可能的next_url行为:

在第一个Feed请求中,只有两个事件可用。 两者均由服务器以及包含偏移量参数2的next_url一起返回。客户端处理完两个提要项目后,客户端将使用偏移量2请求下一个项目。没有新项目可用,因此没有内容的空提要服务器返回一个新的next_url 。 客户端会记住先前的next_url,并在稍后再重试该请求。 这次返回的是新项目,其更新的next_url包含偏移量3。

当然,您可以想出不同的方法来达到相同的结果。

和性能?

显然,从性能的角度来看,提要不能与任何高吞吐量的消息传递解决方案竞争。 但是,我认为对于许多用例来说就足够了。 如果它降低了系统的复杂性,那可能是一个值得权衡的问题。

要考虑的事情是:

  • 服务器创建的事件数
  • 供稿订户数
  • 与事件关联的数据量
  • 事件发布和处理之间的可接受延迟。 这定义了订户的轮询间隔

由于域事件具有不变性,因此可以在服务器上选择使用事件缓存来减少数据库查找。 长轮询和条件GET请求是减少网络负载的可能选项。

结论

提要提供了一种使用REST API将事件发布到其他系统的替代方法,除了用于存储事件的数据库外,无需其他基础结构。 您可以使用现有的Feed格式(如JSON Feed),也可以使用自己的自定义Feed格式。

由于提要的轮询性质,如果您有大量事件和很多消费者,则此解决方案可能不是最佳选择。

翻译自: https://www.javacodegeeks.com/2020/05/rest-using-feeds-to-publish-events.html

rest

这篇关于rest_REST /使用提要发布事件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/543460

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完