分布式系统的消息服务模式简单总结

在一个分布式系统中,有各种消息的处理,有各种服务模式,有同步异步,有高并发问题甚至应对高并发问题的Actor编程模型,本文尝试对这些问题做一个简单思考和总结。

一、消息的“推、拉模式” 

    在传统的Client/Server结构中,信息获取方式是按“拉”(Pull)的模型进行的:服务器根据用户终端发送的服务请求进行处理并返回用户所需的结果。在Push系统中,服务器把信息“推”给用户终端系统。虽然两者数据传输的方向都是从服务器流向用户,但操作的发起者是不同的。从“信源”与“用户”的关系来看,信息的流动可分为两种模式,即信息推送与信息拉取模式。
    在成熟的消息队列产品中,对消息的获取,也分为消息拉取模式和消息推送模式,这两种模式各有优点,需要根据应用的特点来选择。

Push“推”的好处包括:
1、高效。如果没有更新发生,不会有任何更新消息推送的动作,即每次消息推送都发生在确确实实的更新事件之后,都是有意义的。
2、实时。事件发生后的第一时间即可触发通知操作。
3、可以由发布者确立通知的时间,可以避开一些繁忙时间。
4、可以表达出不同事件发生的先后顺序。
 
Pull“拉”的好处包括:
1、如果观察者众多,订阅者来维护订阅者的列表,可能困难,或者臃肿,把订阅关系解脱到观察者去完成。
2、观察者可以不理会它不关心的变更事件,只需要去获取自己感兴趣的事件即可。
3、观察者可以自行决定获取更新事件的时间。
4、拉的形式可以让订阅者更好地控制各个观察者每次查询更新的访问权限。

二、同步、异步和并行

    一个大型的程序系统常常是由很多不能功能模块组成的。程序系统运行时不同功能模块要按一定顺序执行,以协同完成一件任务。功能模块协作运行完成一件任务存在同步和异步两种方式。
    如果在某一时间段,这个程序系统的所有功能模块都在为完成相同的一件任务而服务,某一个功能模块在完成一件任务的子任务后,需要等待其他功能模块完成子任务,这样只有当全部功能模块按顺序完成一件任务后,程序系统才能接收下一个任务,功能模块是串行运行,这称之为同步模式。
    反之,在某一时间段,这个程序系统的不同功能模块可以独立运行完成一件任务的子任务,无须等待其他功能模块完成子任务就可以继续处理下一件任务的子任务,功能模块是并行运行,这称之为异步模式
    反映在OLTP程序系统中,一个交易就是一个任务。如程序系统一次只完成一个交易,在这个交易没有完成前,程序系统不接受其他交易,这就是同步模式。如程序系统把交易任务分拆成几个独立的子进程,每个子进程独立完成交易的一个子任务,几个子进程同时运行,这就是异步模式。由于交易在模块之间是按照一定顺序运行的,所以对一个具体交易而言,模块之间任务执行时并不表现为并行运行,但对大批量交易的宏观效果而言,模块之间却是表现为并行运行

 

三、服务的处理模式

    消息获取的“推、拉模式”,实际上是站在消息的消费者,也就是客户端的角度来说的,即消息是服务器推送给我,还是我去拉取消息的问题。如果站在服务器的角度,也就是消息的生产者来看,也有2种模式。

2.1,“请求-响应”模式 

    这是绝大部分Client/Server结构对信息的处理模式,服务器提供不间断的服务,等待客户端的请求。一旦接收到客户端的请求,服务器马上处理该请求,然后生成处理结果,最后将结果响应给客户端。请求-响应模式通常是一对一的响应,客户端主动发起请求,服务端被动响应。典型的例子就是HTTP服务器。
    请求-响应模式要求服务器能够实时的进行响应,客户端接收到响应后在进行下一步处理,因此它的处理过程常常是“同步”的。但有时候,客户端发出的请求服务端需要进行长时间的处理才能返回结果给客户端,让客户端长时间等待就不合理了,这时候可以使用异步处理技术,客户端发出请求后就返回到自己的处理线程,服务器处理完成后回调客户端提供的方法。广泛流行的Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),就是这种异步处理请求-响应模式的方案,它提供了一种创建交互式网页应用的网页开发技术。

2.2,“发布-订阅”模式

    有时候,不要求服务器收到请求后立刻给客户端响应结果,而是在随后的某个时间,服务器才能处理完成结果或者说生产消息,通过某种方式送到客户端。这种通信模式特别像报刊的订阅:出版社出版一份报刊,读者订阅此报刊,然后出版社通过邮局将报刊定期投递到读者手中。所以我们将这种通信模式形象的称呼为“发布-订阅”模式,即服务器(发布者)发布一个消息主题,客户端(订阅者)订阅此主题,然后服务器定期或者不定期的将消息推送给客户端。

    由于“发布-订阅”模式消息不能及时响应给客户端的特点,所以通常实现为异步处理模式,客户端提供一个回掉函数,服务端有消息的时候这个回掉函数被调用。

    受限于Client/Server结构两端所处的位置不同,客户端可能在内网通过NAT方式上网,并且HTTP短连接的应用特点,Client/Server并不是实时连接的,服务器无法主动连接客户端,那么消息也就无法实时推送给客户端,只有客户端不断的请求服务器来获取最新的消息,于是出现了“长轮询”(long-pull)技术,服务器会Hold住客户端的连接,如果在超时之前还没有结果,那么服务器生成一个空消息给客户端;客户端收到此空消息后再次发起请求,知道收到服务器真正的消息为止。
    但是,长轮询需要消耗过多的服务器资源和网络资源,并且浏览器的并发请求数通常也有限制,所以长轮询并不是一个很好的方案,如果服务器能够主动将消息推送给客户端就可以避免这些问题,于是基于“长连接”的消息推送技术产生了,WebSocket就是这样一种技术:浏览器发起一个普通请求,告诉服务器这是一个WebSocket请求,然后服务器升级服务处理级别,切换到Socket处理方式,与客户端浏览器建立Soket通信通道,当服务器有消息后就推送给浏览器。
    如果客户端不是浏览器,可以直接和服务器建立Socket通信并保持为长连接,由服务器推送消息给客户端。比如PDF.NET的消息服务器框架(MSF),就是基于WCF的TCP双工长连接,来实现服务器推送消息的。

    所以,“发布-订阅”是一种服务模式,它可以通过短连接的客户端轮询请求(pull)或者基于长连接的服务器主动推送(push)来实现。消息的“推、拉模式”,均可实现“发布-订阅”这种种服务模式。

四,消息服务框架(MSF)的服务模式

    消息服务框架(MSF)支持前面讲的两种服务模式:“请求-响应”模式,“发布-订阅”模式。在MSF的具体实现中,“请求-响应”模式是“发布-订阅”模式的特例,内部都是通过后者的基础实现的,可以这么认为:“请求-响应”模式是一种及时响应的,一对一消息推送的“发布-订阅”模式,也就是说,前者只有一个客户端,或者有多个客户端。MSF的这种处理模式,得到一个意外的结果:

  同一个服务,既可以是“请求-响应”模式的,又可以是“发布-订阅”模式,具体取决于客户端的调用方式。

有关MSF的两种服务模式,请参考前篇:
《“一切都是消息”--MSF(消息服务框架)之【请求-响应】模式 》
《“一切都是消息”--MSF(消息服务框架)之【发布-订阅】模式》   


    两种模式从主动性上来看,“请求-响应”模式是客户端主动的,所以我将它简称为 “请求模式”,而“发布-订阅”模式是服务器主动的,所以我将它简称为 “推送模式”。

     MSF的“请求模式”也支持服务器推送消息,即在一次请求过程中,服务器可以多次推送消息给客户端,“回调”客户端提供的函数,所以这种回调结果通常作为服务器最终响应结果的“中间结果”。比如请求一个文件上传服务,服务器多次回调客户端,读取客户端的文件数据。

    MSF的“推送模式”分为定时推送模式事件推送模式,事件推送模式的意思是将服务器发生的事件作为消息推送到客户端,然后客户端响应此事件类型的消息,等同于客户端订阅了服务器的事件,本质上就是一种“分布式事件”了。

五,Actor对象的激活与生命周期

    Actor编程模型是一种基于消息处理的并发编程模型,它有几个典型特点:

  • Actor之间只通过消息进行通信,没有观察者模式或者事件代码的耦合;

  • Actor的内部状态只能由自己改变

  • Actor可以通过消息激活别的Actor以创建响应式的任务,这种类型的任务处理是易于并行处理的。

    消息服务框架(MSF)是基于分布式消息处理的框架,在设计上它具有Actor模式的特点,MSF的每个服务对象实例都是一个Actor,MSF通过不同的服务模式来控制Actor的生命周期:

  • “请求-响应”模式:每次请求,服务器会创建一个独立的服务对象实例

  • “发布-订阅”模式:每一个相同“主题”的订阅,服务器会创建同一个服务对象实例

    这里说的“主题”,指的是相同的服务名,相同的方法名和相同的参数值,在MSF中,也称呼为“订阅任务”。客户端订阅不同的主题,服务端会创建不同的服务对象实例。

    不管是哪种服务模式,MSF的服务对象实例(Actor)它的生命周期都会执行到服务方法执行完成,但是“发布-订阅”服务模式的服务对象实例,它执行完成任务后可以继续等待直到设定的超时时间之后,这样不必创建新的服务对象而接受下一次的订阅请求。当然,也可以在服务的订阅任务处理完成后,通过编码及时停止服务而不等待。

    创建同一个服务对象实例有一个很大的好处,它让多个订阅的客户端共享了同一个服务对象实例,将会非常有用。
    比如客户端订阅了产品A的服务,相当于客户端激活了服务端的一个对象,这个对象将存活到它的任务处理完成为止。如果另外一个客户端也订阅了产品A的服务,新客户端将一样收到服务端推送过来的消息。

    假设客户端A激活了服务端B服务,而服务端B服务又去调用服务端C服务,将激活服务端C服务.....一个分布式对象服务的链式激活过程开启了。你只需要去调用需要的服务,服务的激活和服务对象的销毁,MSF框架会帮你搞定一切。

    总之,MSF的这种服务之间的通信都是通过消息进行的,对象之间只有消息,并且是分布式的消息,所以,MSF是一个真正的分布式Actor编程模型。


原文地址:https://www.cnblogs.com/bluedoctor/p/8127122.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud面试题(2020最新版)

转载自 Spring Cloud面试题(2020最新版) 为什么需要学习Spring Cloud 不论是商业应用还是用户应用,在业务初期都很简单,我们通常会把它实现为单体结构的应用。但是,随着业务逐渐发展,产品思想会变得越来…

《Office 365 开发入门指南》

终于等来了这一天,可以为我的这本新书画上一个句号。我记得是在今年的2月份从西雅图回来之后,就萌发了要为中国的Office 365开发人员写一些东西并最终能帮到更多中国用户的想法,而从2月26日正式写下了第一篇,到今天正好是整整十个…

助力中小企业级连云端,促进工业互联网平台蓬勃发展,全套解决方案。附:技术产品

1.概述经过两年多团体的努力,四个产品终于面世了,做产品不容易,做好产品更不容易,最终形成了体系化的解决方案。下面具体介绍。行业大数据平台以及工业互联网平台的发展是必然趋势,结合自己的工作经验&…

基于百度AI实现 车牌识别

前言目前百度的AI接口相对完善,对于文字识别类的操作还需要开发者一一去尝试,去评估这效果到底是怎么的。文字识别的接口相对简单,官方提供的SDK也集成很好,笔者只是在这上面做了一些前期性的功能数据校验和过滤,以及返…

面试官问我:Redis 内存满了怎么办

转载自 想不到!面试官问我:Redis 内存满了怎么办 Redis占用内存大小 Redis的内存淘汰 LRU算法 LRU在Redis中的实现 LFU算法 问题 Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以…

开源组件NanUI一周年 - 使用HTML/CSS/JS来构建.Net Winform应用程序界面

NanUI是什么NanUI基于ChromiumFX项目进行开发,它能让你在你的Winform应用程序中使用HTML5/CSS3/Javascript等网页技术来呈现用户界面(类似Electron)。同时NanUI提供了原生窗口和定制化的无标题栏无边框窗口,你能使用全部的网页技术…

ThreadPoolExecutor 八种拒绝策略,对的,不是4种

转载自 ThreadPoolExecutor 八种拒绝策略,对的,不是4种 前言 谈到 Java 的线程池最熟悉的莫过于 ExecutorService 接口了,jdk1.5 新增的 java.util.concurrent 包下的这个 api,大大的简化了多线程代码的开发。而不论你用 Fixed…

采用Opserver来监控你的ASP.NET项目系列(三、监控你的服务器状态)

前言之前有过2篇关于如何监控ASP.NET core项目的文章,有兴趣的也可以看看. ASP.NET Core之跨平台的实时性能监控ASP.NET Core之跨平台的实时性能监控(2.健康检查)今天我们主要来介绍一下,如何使用Opserver监控我们的服务器状态.Opserver的功能其实很强大,他可以用于连接任何支持…

Net Core中数据库事务隔离详解——以Dapper和Mysql为例

事务隔离级别.NET Core中的IDbConnection接口提供了BeginTransaction方法作为执行事务,BeginTransaction方法提供了两个重载,一个不需要参数BeginTransaction()默认事务隔离级别为RepeatableRead;另一个BeginTransaction(IsolationLevel il)可以根据业务…

2017年,我的身边发生了那些事?

不知不觉,运营独具.NET跨平台特色的微信公众号:dotNet跨平台至今已经整整三年光景了,这三年里微软开源.NET也满三周年了。三年时间说长不长,说短也不短了,然而我还是保持着每天三篇的更新 ,或有感而原创&am…

ABP .Net Core Entity Framework迁移使用MySql数据库

一、迁移说明ABP模板项目Entity Framework Core默认使用的是Sql Server,也很容易将数据库迁移到MySQL,步骤如下。二、迁移MySQL步骤1、 下载项目请到 http://aspnetboilerplate.com/Templates 下载一个新的项目,选择ASP.NET Core 2.x标签&…

(四)十大经典排序算法(动画图解,代码完全)

排序算法是《数据结构与算法》中最基本的算法之一 1. 冒泡排序 1.1 算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。…

(五)SpringBoot 能挣钱的几个项目!!!

不得不佩服 Spring Boot 的生态如此强大,今天给大家推荐几款 Gitee 上优秀的后台开源版本的管理系统,小伙伴们再也不用从头到尾撸一个项目了,简直就是接私活,挣钱的利器啊。SmartAdmin我们开源一套漂亮的代码和一套整洁的代码规范…

手把手引进门之 ASP.NET Core Entity Framework Core(官方教程翻译版 版本3.2.5)

以下是手把手引进门教程,基于 ASP.NET Core, Entity Framework Core ,ABP 框架 创建Web 应用, PS: 自带自动的测试模块哦。样例下载 (上 github 的请自便)介绍这是系列文章的第一部分&#xff1…

图像识别:微信跳一跳机器人

准备IDE:VisualStudioLanguage:VB.NET/C#GitHub:AutoJump.NET本文将向你介绍一种通过图像识别实现“跳一跳”机器人的方法。 第一节 图像识别文中提到的所有方法和步骤均仅涉及简单的向量计算。需要哪些计算?比较像素点的颜色求向…

(七)HTML和CSS 、JavaScript 和Java到底有什么区别,今天终于明白了!!!

有人曾经问过,“HTML CSS 和 JavaScript 以及 Java有什么区别” TCP VS UDP Java VS C 功能先上了再说 高级开发人员作为一个团队进行编程 调试CSS 高级开发人员重构代码 能一个手指完成的绝不用两只手 看实习生编码的时候,我的表情…… 当我尝试进入B…

基于Accord.Audio和百度语言识别

目标需求使用录音形式,模拟微信语音聊天。按住录音,松开发送语音,并完成语音识别。ps:百度的语言识别有60秒长度限制,需要自己做好控制。实现方案采用C# winform 程序实现桌面版,采用Accord 实现语音录制停…

(八)Spring与MyBatis整合

持久层 目录 Mybatis 开发步骤回顾Mybatis 开发中存在的问题Spring 与 Mybatis 整合思路Spring 与 Mybatis 整合的开发步骤Spring 与 Mybatis 整合的编码搭建开发环境 pom.xmlSpring 配置文件的配置编码Spring 与 Mybatis 整合细节持久层整合总述 1、Spring 框架为什么要与持…

Git 企业开发者教程

为什么要写这样一个面向企业开发者的Git教程?这个问题也困扰我自己很久。其实我使用git的时间也不短了,但是就和正在阅读本文的每一位一样,常用的基本就是那么几个(git clone, git push)等等。然而git其实有着非常强大的功能,如果…

基于百度理解与交互技术实现机器问答

一、前言我们都知道现在聊天对话机器是一个很有意思的东西,比如说苹果siri,比如说微软的小冰。聊天对话机器的应用场景也很广泛,比如说:银行的自助办卡机器人、展会讲解解说等等。我们对机器人说句话,机器人从听取&…