分布式异步消息框架构件 —— 设想

前几天在查看关于 Actor模式的一些资料,包括Erlang在游戏中一些资料,虽然本人不会Erlang但是稍微看了下编写方式.觉得还是有可借鉴的地方的.因为实在不熟悉不枉加评论了.这里说下自己的一些理解.

从这几年Erlang和函数式编程的崛起,引发OOP编程的一些不足,但是OOP并不妨碍获得相关的优点,只不过需要一些有效的框架和规范支持。

首先这里有几个简单的问题:

1.OOP方式面临多线程,跨进程访问问题,那么就有所谓的锁问题。

2.函数式编程的优点,不可变数据,并发时无需关心对象状态是否会被别的改变。

3.Nodejs异步编程,在IO上有着高效的吞吐,因为没有所谓的等待,但是,回调嵌套。

4.如果采用单线程OOP的编程方式,那么是否可以达到所期望的要求,但是如何处理多任务?

设想:

1.以完整的消息模式作为传递,但是我们并不抛弃OOP,所以并不是以函数式的方式传递,而是以完整对象方式传递。

2.单线程的模式,所有逻辑都使用模块的方式 封装,单个模块运行在一个线程中,跨模块不可直接访问。

3.多任务问题,使用运算时间片模式,手动控制中断以及切割,在单线程分割类似Lua Coroutine,达到切换任务的结果。

4.脱离回调,因为是异步的方式,所以很多逻辑都有回调,采用同步模式来编写,使用Coroutine来进行中断等待返回,并继续执行。

5.跨模块访问检测,将默认访问转换为代理模式。

6.因为基于消息的模块间访问方式,那么只要消息可序列化,那么分布式也就理所应当了。

7.如果模块隔离,那么模块热更新也是可以有效支持的。

测试和基础框架选型:

从技术选型和测试上Disruptor 是应该能胜任的消息队列,单线程达到百万级别ops的处理能力.而且并不是所有函数都需要消息传递的.用于处理多任务切割和单线程逻辑.

然后是ZeroMQ,因为采用异步回调模式,所以只要单向数据流的测试,达到十万以上ops还是比较轻松的.

对两者的结合表现还是比较期待的.

时间: 2024-10-07 03:31:51

分布式异步消息框架构件 —— 设想的相关文章

分布式异步消息框架构件3 —— 自动消息路由

这个系列慢慢变成先设想后完成的模式了,上篇我们测试了以Yield当多任务处理. 楼主写了个小Demo也完成了类似功能,并且支持中途等待,直接等到完成回调后,继续处理下一阶段. 这个功能可以完成类似逻辑事件流,比如C需要等待A,B完成后再执行,而且写法也比较简单.直接上代码: //创建事件,把Handle丢入Yield队列, //执行当发现有等待Handle状态为YieldWating //放入YieldWating队列 //回调时检查YieldWating队列,重新激活 Context.Wati

分布式异步消息框架构件2——yield机制及单线程多任务系统

上一篇这边进行了一些结构上的设想,主要的核心内容就是消息和单线程实现. 这篇就介绍下如何通过C#中yield关键字,达到单线程执行多任务实现. 首先了解下yield的使用..         public static IEnumerable<object> YieldTest()         {             int x = 0;             x++;             yield return x;             x++;            

分布式异步消息框架构建笔记5——如何避开并行编程中的数据共享陷阱

任何多线程/并行/分布式都会面临一个问题,"数据状态共享". 有经验的开发者会说,要想正确有效的避开避开状态共享,那么就应该别用任何状态共享. 虽然不得不说,这是一个不错的建议,但是没有状态共享,你需要如何才能知道非本地数据的状态? 也许你会说使用消息,使用消息来处理,那么我们丑陋的回调金字塔应该叠的更高了. 不得不说这是一个解决办法,但是为了保持状态不被修改,那么我们还得在远程申请一个写入锁,防止数据被别的任务所修改. 那么流程就是 申请锁->请求某个消息状态->释放锁

分布式异步消息框架构建笔记4——分布是消息路由

上一篇实现了消息的自动路由,这边写了一个小测试,大家可以猜一下运行输出结果是什么? public class RouterTest { public static void DoRouterTest() { var contextA = Context.Creat("A"); var contextB = Context.Creat("B"); contextA.RegServiceClass(typeof (MyClassA)); contextB.RegServ

Python开发【模块】:Celery 分布式异步消息任务队列

Celery 前言: Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子: 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情. 你想做一个定时任务,比如每天检测一下你们所有客户的

基于Scala的Actor之上的分布式并发消息驱动框架Akka初体验

学习了基于Scala的Actor之上的分布式并发消息驱动框架Akka初体验,应用actor模型,位置透明,做到高并发.可伸缩.容错.单机也可以用,水平扩展.垂直扩展.容错都有很好的表现,spark中的例子如下: private def initializeEventProcessActor(){ implicat val timeout=Timeout( 30 seconds) val initEventActorReply= dagSchedulerActorSupervisor ? Prop

django celery的分布式异步之路(一) hello world

设想你遇到如下场景: 1)高并发 2)请求的执行相当消耗机器资源,流量峰值的时候可能超出单机界限 3)请求返回慢,客户长时间等在页面等待任务返回 4)存在耗时的定时任务 这时你就需要一个分布式异步的框架了. celery会是一个不错的选择.本文将一步一步的介绍如何使用celery和django进行集成,并进行分布式异步编程. 1.安装依赖 默认你已经有了python和pip.我使用的版本是: python 2.7.10 pip 9.0.1virtualenv 15.1.0 创建沙盒环境,我们生产

微信后台异步消息队列的优化升级实践分享

1.引言 MQ 异步消息队列是微信后台自研的重要组件,广泛应用在各种业务场景中,为业务提供解耦.缓冲.异步化等能力.本文分享了该组件2.0版本的功能特点及优化实践,希望能为类似业务(比如移动端IM系统等)的消息队列设计提供一定的参考. 2.关于分享者 廖文鑫,2013年加入腾讯,从事微信后台基础功能及架构的开发和运营,先后参与了消息通知推送系统.任务队列组件.春晚摇红包活动等项目,在海量分布式高性能系统方面有丰富的经验. 3.背景介绍 微信后台给件 MQ 1.0 发布之初,基本满足了一般业务场景

异步消息的传递-回调机制

简介: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用:回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口:异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口).回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知.同步