处理事件

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

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

活动提要

解决此问题的另一种方法是使用提要 。 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将事件发布到其他系统的替代方法,除了用于存储事件的数据库之外,无需其他基础结构。 您可以使用JSON Feed等现有的Feed格式,也可以使用自己的自定义Feed格式。

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

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

REST /使用提要发布事件相关推荐

  1. //rest风格写_REST /使用提要发布事件

    //rest风格写 处理事件 当使用多个解耦的服务时(例如,在微服务体系结构中 ),很有可能需要一种方法来将某种域事件从一个服务发布到一个或多个其他服务. 许多广泛采用的解决方案依赖于单独的基础结构来 ...

  2. Android应用开发—eventBus发布事件和事件处理的时序关系

    占坑,简单说明下eventBus发布事件和事件处理的时序关系. 什么时候使用sticky: 当你希望你的事件不被马上处理的时候,举个栗子,比如说,在一个详情页点赞之后,产生一个VoteEvent,Vo ...

  3. es6 使用修饰器实现自动发布事件

    使用修饰器实现自动发布事件 我们可以使用修饰器,使得对象的方法被调用时,自动发出一个事件. const postal = require("postal/lib/postal.lodash& ...

  4. macOS下 wacom “安全设置阻止Wacom软件发布事件”错误的解决方法

    1.打开安全与隐私 辅助功能.先点击左下角的小黄锁解锁.然后把 "com.wacom.IOManger.app"打钩.打钩过程可能还会弹出"安全设置阻止Wacom软件发布 ...

  5. 记录一次生产发布事件——(简单的非空验证也能引发大问题)

    事件经过 下午四点,发布生产g环境(生产环境m为正式环境,g为内测环境).这时测试有人提出"服务器忙".听到这里我赶紧翻了翻内测日志,发现了最熟悉的老朋友--未将对象引用设置到对象 ...

  6. 五眼网络安全机构联合发布事件响应指南

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 位于澳大利亚.加拿大.新西兰.英国和美国的网络安全机构联合发布关于检测恶意活动和事件响应的安全建议. 报告指出,最佳实践事件响应程序始 ...

  7. 企业为什么要做软文网络发布事件营销,怎么做?

    随着时代的发展,媒体属性在不断改变,用户上网的行为习惯也在不断改变,唯一不变的是信息的表现形式:文字.图片.视频.音频.软文就成了是现代营销中很受欢迎的一种方式,但是很多看不到软文营销的效果,因此,很 ...

  8. spring中事件发布设计与实现

    spring中的事件发布框架依赖于三个抽象,ApplicationEvent,ApplicationListener,ApplicationEventPublisher.ApplicationEven ...

  9. 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )

    文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...

最新文章

  1. python管理包管理工具pip和conda使用,及使用pip和conda创建虚拟环境
  2. 斯坦福大学的机器学习跟深度学习。
  3. 中国农民丰收节交易会新闻发布会倡导功能农业·农业大健康
  4. sql 增加链接服务器,SQL server利用脚本添加链接服务器,可设置别名
  5. C++操作SQLite简明教程
  6. P3224-[HNOI2012]永无乡【平衡树,启发式合并】
  7. 科研福利!北京超算获通用CPU算力第一,2000核时免费领取
  8. php 个人中心常见界面,UI设计灵感:个人中心界面设计(User Profile)
  9. java钟表动画_JavaFX实现简易时钟效果
  10. discuz 风格模板制作
  11. 裂变海报设计的落地干货,为什么海报在裂变活动中这么重要?
  12. 论文中的常见缩写(w.r.t/i.e./et al等)的意思
  13. R语言将变量分组的三种方法(含cut函数介绍)
  14. 律师向公安部举报称微软黑屏是最大黑客行为
  15. EF-AsNoTracking()
  16. 如何把Dom对象转换成jQuery对象,如何把jQuery对象转换成Dom对象
  17. Lifecycle 使用与源码分析——彻底搞懂Lifecycle原理
  18. matlab狐狸与野兔数学模型,狐狸与兔子数学模型的论文
  19. Linux驱动开发-proc接口介绍
  20. Linux操作系统各版本ISO镜像下载(包括oracle linux\redhat\centos\ubuntu\debian等)

热门文章

  1. OJ4007-计算字符串距离【各种dp之2】
  2. 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love exam(背包)
  3. 【归并排序】奶牛的图片(jzoj 1812)
  4. Top Secret Task(dp+滚动数组)
  5. java实现下载时进度条提示
  6. 1、jquery事件绑定和委托的实现
  7. 3 年 Java 应该具备的技能体系
  8. 面试过程中千万不要犯这 5 点低级错误
  9. 漫画:Bitmap算法 整合版
  10. 用数组选出最大的数并且排序