Reactive Messaging Patterns with Actor Model — 1 从 Enterprise application说起

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Reactive Messaging Patterns with Actor Model — 1 从 Enterprise application说起相关的知识,希望对你有一定的参考价值。

参考技术A 几年前我在前前一家公司任职Architect的时候,开始开启了我对大型系统架构设计的起点,当时跟我的leader 请教关於 系统之间的互动的设计概念,聊起了发展史。

通常一家持续发展中的企业,他的IT相关系统的建构面貌也几乎都跟他的企业发展面貌相近,在不同的时间点常常都是一小块一小块的被长出来,也因此常常都是彼此独立的silo并赋予它所被期待的目标。

1. 档案 — 透过指定的存取档案路径位置,让沟通的系统之间透过档案存取的锁的轮流掌握,进行资料的更新与获取。

2. 资料库 — 有了资料库以後,把资料库作为跨系统间资料状态变化的监控与获取一时间成了显学,不管三七二十一,反正我就是把存取的责任从系统卸载,不管是跨Schema 的授权存取,还是跨db之间的db-link 绑定仅读权限的控制,也都成功地度过了好一段时间。

3. 服务层的API — 陆续大家意识到了,直接暴露资料库存取层带来了很多隐忧,表结构产生变化时各个存取端都要一直跟著改动,於是产生了封装单一业务标的的念头,只是这API设计的粒度粗细一直也还没有很好的万用策略。有人主张从终端使用的角度来设计API ,有人主张从Domain Object 肩负的责任出发,更甚者是兼具两者,透过组装的方式把各个Domain Object提供的API 给串接呼叫,提供成为用户端使用的API。

4. 讯息模式 — 时间走到了ESB/SOA的年代,开始各种厂商大力倡导,透过消息队列(Message Queue)的方式为系统间的沟通进行分解,由於跨系统间的互动,除了一般业务应用标的用途,也常常伴随著资料格式的翻译解释,此外在实务上的跨平台间的消息沟通也有著通讯协定的包装与转换的处理,ESB/SOA可还真活了很长一段时间。

Reactive Messaging,强调的就是回归到真实世界的讯息互动的缩影的方式,每一个或多个参与在同一个事件的互动者(元素/系统),都会关心著他们想知道的话题事件何时被发生,以及事情发生了以後要怎麼因应,当然,若遇到了处理不了的部分可以怎麼样找到适当的协助方式。

像这样典型的事件驱动,讯息沟通模式,要回归到偶像Eric Evans在2003年发表的 Domain Driven Design,在DDD的思维模式下,主张要从Problem Domain出发,确立你要解决的问题的边界,从而找出:

快速基本理解DDD,可以看 这边 ,实际上DDD很深无法一下子看完的…

Domain model 找出来以後,大家开始思考这样的跨领域之间的讯息交互模式该是什麼样的方式,2005年另一个偶像Martin Fowler 基於当时对於DDD的理解认知,提出了CQRS 与 Event Sourcing 的设计样式作为实践DDD的参考,尤其Event Sourcing样式充分的支撑了DDD 的讯息跨domain的传递模式。

DDD强调,所有的问题本质,都该回归到以Ubiquitous Language 作为沟通的基础,把软体实践的设计重心都放在Domain Model上,对於当前你所使用的任何技术实践手段,都应该是属於偏於外围的/基底的,随时都可被抛弃与置换的,所以Eric Evans 也提出了他认为一个理想的系统设计架构原型

我记得在web 兴起的那个年代,各家大厂开始纷纷从 Client-Server 转往 WWW 的系统设计,每一家厂商都推出了符合於自有产品/设备/软体框架的最有力的推广话术,各种基於新的Web Design 的pattern 横空出世,最著名经典的 Java EE 系列的战争 → To apply EJB or not !

我印象中我以前也乖乖的K过 Core Java EE Pattern,还跟著他念了两个版本(基於不同时期的Java EE version稍有变形)。

人真的很容易被洗脑,我自己也不例外,在面对商用系统与强大的网路资讯传递过程中,决大部分的开发者的系统设计风格,都直接的与框架靠拢对齐,从而很自然的衍生出:

更甚者,你几乎可以在各大知名的框架工具的官方网站上,直接大咧咧地告诉你 Best Project structure convention

从套用这些框架的角度去看,再去回推对照比对Eric Evans 所提的Port And adapters 架构,是不是有种完全相反的感觉?

再回想一下刚开始接触程式设计以及物件导向语言的时候,我们都知道物件的组成是涵盖了属性与行为,但怎麼真的工作以後却发现好像写出来的代码都跟一开始的理解差很多,有一堆的DTO,有一堆的不知道要干嘛被工具gen出来的物件!

而且领域物件本身是有状态的,但WEB 类型的系统设计却都是无状态的

领域物件被我们设计出来之後,他的状态始终都只是被落地到资料库去(以交易型系统的设计来看,几乎都是如此) ~

至此,重新回归初心,再想想你年轻时第一次接触Object的时候的那个拟人化的学习描述方式 → 物件有动作,有责任,有资料,有代表的意义 !!

Reactive Messaging with Actor Model,正是要以此为起点,用这样基於DDD的基本思维模式来进行系统设计

如何在 Chrome 中实现 Google Cloud Messaging - Topic Messaging?

【中文标题】如何在 Chrome 中实现 Google Cloud Messaging - Topic Messaging?【英文标题】:How to implement Google Cloud Messaging - Topic Messaging in Chrome? 【发布时间】:2015-06-10 03:35:06 【问题描述】:

Google Cloud Messaging for Chrome 文档中没有关于主题消息功能的信息。 https://developers.google.com/cloud-messaging/chrome/client

还没有?

这里是没有订阅方法https://developer.chrome.com/apps/gcm的GCM参考文档

这里是提供订阅/取消订阅方法的 GcmPubSub 类的 Android 和 iOS 参考: https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmPubSub https://developers.google.com/cloud-messaging/ios/api/gcm/interface_g_c_m_pub_sub

【问题讨论】:

嗨,我从你在 Gcm 的 github 问题中的帖子中找到了你,我遇到了不可靠的主题消息传递给用户,如果你已经设法克服了你的问题,你可以看看这个在这里提问并回答吗?我们非常感谢您的时间和帮助 :) ***.com/questions/33146089/… @RockoDev 最近发布了一个 Firebase Cloud Messaging JavaScript 库,它可能包含您正在寻找的东西。看我的回答here。 【参考方案1】:

很遗憾,它尚未实施。请在此处联系:https://groups.google.com/forum/#!forum/gcm-for-chrome-feedback 与开发人员联系或在此处提交功能请求:https://code.google.com/p/chromium/issues/list

【讨论】:

谢谢,希望尽快实施。【参考方案2】:

发布答案以查看我评论的答案。


FCM 最近宣布(2016 年 10 月 17 日)Firebase JavaScript library:

今天,我们发布了一个 JavaScript 库,宣布对 Firebase 云消息传递 (FCM) 的网络支持。这扩展了我们当前的浏览器支持,实现了显着简化的实施过程,并为网络带来了强大的功能,例如主题和设备组消息传递

--

使用 FCM JavaScript 库,您可以将网络推送通知发送到单个设备、主题或设备组。通过在 Web 上添加主题支持,我们使开发人员能够向选择加入特定主题的 Android、iOS 和 Web 用户发送消息。要利用主题和设备组,您可以将服务器端 API 用于 manage your topics 和 groups subscriptions。

Setting Up the JavaScript Client App 的 Firebase 文档链接。

【讨论】:

以上是关于Reactive Messaging Patterns with Actor Model — 1 从 Enterprise application说起的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter

@react-native-firebase/messaging : TypeError: (0 , _messaging.default)(...).registerForRemoteNotific

如何在 Chrome 中实现 Google Cloud Messaging - Topic Messaging?

firebase_messaging_web 和 firebase_messaging 有啥区别,哪一个应该用于跨平台项目?

vue3.0 reactive函数

Azure Messaging-ServiceBus Messaging消息队列技术系列7-消息事务