`
youxinrencwx
  • 浏览: 71517 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

技术方案的讨论过程来看化繁为简

 
阅读更多

Author:文初<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Blog: http://blog.csdn.net/cenwenchu79/

问题

小丹同学在旺旺上问我是否可以用Memcached实现简易消息中间件类似的功能。觉得这个需求很奇怪,就问了一下具体的应用场景,然后小丹就上来和我具体的谈了究竟需求是什么。其实小丹的应用场景是这样的:客户需要分析一些业务数据,但是业务数据又是很庞大的,在原有系统每天晚上都有一次日分析,将业务数据分析并且归档,但是如果要产生即时分析的效果,用原有系统无法实现,因为当天的数据内容没有被分析,同时如果即时的去分析并且累加到历史分析数据上,性能也不能满足需求,因此考虑通过消息机制来实现异步分析,至于异步处理的时间容忍度,可以通过配置来实现,同时希望异步分析是可线性扩展的,支持集群,提高效率。为什么不直接使用中间件呢?高并发的稳定性,维护的成本,性能要求,使用成本,这些直接就排出了直接去使用中间件的想法。

起始方案的讨论

在回到小丹最初提到是否可以通过Memcached来实现类似于简易消息中间件的问题上来。首先是否将消息队列作为一个对象保存在Memcached中,这种做法明显不支持高并发的情况,因为Cache本身的get,put无法保证事务。在Memcached中只有计数器是支持高并发的操作,因此考虑是否使用计数器并且按照一定规则来生成key,通过对计数器的增减来让不同消费者获取到不同的消息,这种机制最大的问题在于:1.轮询的压力不小(小丹希望是订阅者模式,Push过去而不是Pull)。2.计数器增减不论怎么做都实现的是栈而不是队列。那么是否使用我扩展的MemcachedKeySet,这点我自己就反对了,这个功能效率很低,而且对于Memcached本身在高并发下操作是否有影响还不得而知。问题越绕越走向死胡同了。

方案的转变

转换思路,重新分析小丹的需求,究竟哪几点是他真实需要的:1.通过消息方式解耦Web应用和业务分析处理。2.消息必须较为及时的传递到业务分析模块。3.业务分析模块需要支持集群方式线性扩展性能。实现这些需求真的需要简单的消息中间件或者集中式存储么?看看下图的结构:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="图片_x0020_1" style="VISIBILITY: visible; WIDTH: 277.5pt; HEIGHT: 286.5pt; mso-wrap-style: square" type="#_x0000_t75" o:spid="_x0000_i1026"><imagedata o:title="" src="file:///C:/DOCUME~1/WENCHU~1.CEN/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.emz"></imagedata></shape>

从图上可以看出这么几个问题:1.消息中间件本身处于单点,如果需要扩展或者消息本地化增加了复杂度。2.对于消息的获取是采用push还是pull,如果是push那么需要中间件支持订阅者的维护,如果是pull,则需要考虑并发以及性能问题。3.消息的即时性,这个还是依赖于消息中间件的实现机制。总的来说,如果要通过集中式缓存方式实现消息中间件的简单功能,还是有很多问题。那是否直接使用消息中间件的第三方支持呢,其实又回到了最初提出的不使用的缘由。这么设计是否太复杂呢?

回过头来看看Memcached的使用情况,突然发现其实事情可以简单来说,我记得写过一些说明来解释为什么我说Memcached是集中式缓存而不是分布式缓存,其实是客户端的分发算法让很多人觉得好像分布了数据和可无限扩展。其实这种技术结合Hadoop HDFS的部分设计思路,可以给出一个比较好的解决方案。看看下图的结构设计:

<shape id="图片_x0020_3" style="VISIBILITY: visible; WIDTH: 415.5pt; HEIGHT: 302.25pt; mso-wrap-style: square" type="#_x0000_t75" o:spid="_x0000_i1025"><imagedata o:title="" src="file:///C:/DOCUME~1/WENCHU~1.CEN/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.emz"></imagedata></shape>

上图去掉了消息中间件的角色,增加了Asyn Processor Manager的角色,但是此角色也可以去掉,更为简化的实现需求,增加Asyn Processor Manager的功能仅仅是为了提供动态增减Asyn Processor的功能。具体说一下流程:

1. Web应用启动时,读取本地配置获取Asyn Processor列表载入内存,同时根据Asyn Processor Manager的配置去发起请求获取Asyn Processor最新的可用列表(如果无法获取,则以本地的为准)。

2. Web应用根据本地实现的分发算法(最简单就是采用key hash),来选择Asyn Processor,发送请求处理的消息。

3. 如果Asyn Processor Manager不存在,Web应用也可以实现定时发起query status请求来确认Asyn Processor的存活状态,并且更新,保证消息的正常发送。如果Asyn Processor Manager存在,那么确认Asyn Processor状态是否存活可以由Asyn Processor Manager来做(Push或者Pull),而Web应用则可以使用对Asyn Processor Manager的定时查询来获得最新的Asyn Processor列表。

4. Asyn Processor Manager可以提供增加和删除Asyn Processor的接口,这样就可以支持Asyn Processor的增加和删除,但也正因为Asyn Processor Manager的单点易于注册和管理Asyn Processor,也增加了单点的风险,因此每一台Web应用需要对Asyn Processor Manager不可用作好本地化配置的后备策略。

5. 使用Http协议作为消息传输协议,这样避免SA去维护端口的麻烦,同时也能够充分利用REST的方式来完成业务逻辑(Options方法可以用于心跳,PutDelete可以用于Processor的增减(设置Http Head认证方式即可解决安全问题),Get方式获取信息(xml,json等等格式可以很容易处理))。

上面的方案可以看出,如果去掉Asyn Processor Manager,其实方案很简化,就是每一个客户端有一层类似于Memcached客户端的分发机制,同时比Memcached免去了对于连接池维护的复杂性,仅仅只需要维护状态标示即可。

最后还嘱咐小丹对于Asyn Processor的设计需要合理化,这部分需要支持消息接受和处理的并行处理,提高Asyn Processor的处理能力,同时通过分页批量处理消息的方式减少对于DB的压力(当然需要根据具体的时效性设置消息页的大小以及消息页Flush的时间)。

后话

上面的方案可能不是最好或者最优的,这里仅仅只是分享一下自己解决这个问题的一些心得。这此的方案讨论也走了一些弯路,有时候在做任何选择以前首先需要考虑的是到底自己需求是什么,然后再去考虑选择什么技术去实现。同时尽量还是那句老话”Make it Simple”,做技术的人总是喜欢做的很复杂,功能很强大,但是最后迷失了最初的目标,忙于去完善那些80%没有用的功能,却没有去做好那20%客户最Care的功能。化繁为简,见招拆招,才能四量拨千斤。
分享到:
评论

相关推荐

    删繁就简-单片机入门到精通.pdf

    讨论了整数运算溢出的问题及其解决方案。 **4.12 强制转换** 解释了何时以及如何使用类型强制转换。 **4.13 高效实用位运算** 位运算操作简单且执行速度快,在单片机编程中非常有用。 **4.14 宏和register** ...

    善思多媒体网络教室解决方案.pdf

    此外,教师的授课过程可以被自动录制并存储于服务器,学生可通过网络随时随地回看,这不仅方便了学生的复习,也使得教学资源更加持久且易于获取。 善思多媒体网络教室解决方案融合了丰富的教学功能,为教师和学生...

    企业公司网站管理系统中英繁版

    【标题】:“企业公司网站管理系统中英繁版”这一标题暗示了我们讨论的是一个专为公司设计的网站管理系统,该系统支持中文、英文和繁体中文三种语言版本。这意味着系统具有多语言功能,能适应不同地区的用户需求,...

    中文语音识别技术在C#中的应用,发声程序,语音朗读

    首先,我们来看`DotNetSpeech.dll`这个动态链接库文件。它是实现语音识别和合成的关键组件,可能包含了一系列接口和类,用于处理音频输入、语音识别以及语音合成。使用这样的库,开发者可以在C#项目中调用相关的API...

    苏教版《解决问题策略方案》(替换).ppt

    通过这种替换,学生能够化繁为简,运用加法和除法来求解问题。 再看案例3,这里小杯与大杯的容量关系发生改变,小杯容量比大杯少160毫升。采用替换策略,设小杯容量为y毫升,大杯容量自然就是y + 160毫升。根据问题...

    ccb v4.155 utf-8繁体中文版

    从压缩包子文件的文件名称列表 "bbs4155_utf8" 来看,这很可能是ccb软件的安装文件或者数据包。它可能包含可执行文件、配置文件、数据库结构、语言文件、图片资源和其他支持论坛运行的必要组件。安装或部署这个软件...

    我看多媒体课件与政治课教学的关系

    而多媒体课件可以通过补充丰富的教学资源,如新闻报道、纪录片、统计数据等,使理论知识与实际情况相结合,帮助学生更好地理解和掌握知识点,同时还能利用多媒体特性将复杂的问题分解,化繁为简,突出重点,使学生能...

    贵州省毕节市梁才学校2020届高三语文10月月考试题201912030124

    不过,从【标签】"资料"和【部分内容】来看,我们可以理解这是一个关于教育、考试和汉字规范化的讨论。 在给出的【部分内容】中,主要探讨了汉字简化和规范化的必要性和历史发展。汉字是中国的重要符号,其简化和...

    试谈猪场事业部信息化建设.doc

    在现状分析中,事业部已有的三个猪场计划扩展为更多的原种和扩繁场。然而,目前的信息化工具并不完全适应猪场业务,如K3系统是从饲料业务转移而来,功能不足。此外,生产育种软件的多样性(herdsman、GBS和自建系统...

    讨论记录-0204-nsga31

    【讨论记录-0204-nsga31】这篇记录主要探讨了两种多目标优化算法,NSGA-2和NSGA-3的区别,以及一个名为BA(可能是指Bee Algorithm或Bat Algorithm)的算法。这里我们将深入解析这些概念。 1. NSGA-2与NSGA-3的区别...

    【金版教程】(全国通用)2015高考政治二轮复习知能提升 专题十四 矛盾观与辩证否定观

    以加法与减法的讨论为例,减法哲学提倡化繁为简,去除多余的负担,是对加法的一种辩证否定。它在减少非本质因素的同时,保留了事物的核心价值,从而达到整体优化的效果。这一点对于优化学习方法、提高工作效率等都...

    水墨风笑谈演说PPT模板.ppt

    模板中的“大道至简,衍化至繁”强调了技术的核心价值在于简洁、高效,而实际应用中又可能衍生出复杂多样的解决方案。 “称文小而指极大,举类迩而见义远”——这一设计理念意味着尽管模板可能看起来设计简洁,但其...

    卸载小助手软件卸载工具v1.0绿色免费版

    卸载小助手的操作界面十分简洁,它将繁复的卸载步骤化繁为简,省去了用户必须通过控制面板查找“程序和功能”中的软件的麻烦。只需运行卸载小助手的主程序,它就会自动扫描并列出系统中安装的所有软件,用户仅需通过...

    辽宁师大附中2015_2016学年高二语文上学期12月月考试题

    再来看空格使用的区别。在中文输入中,词与词之间无需额外的空格分隔,这不仅缩短了输入时间,也使得整个输入过程更加流畅。而英文输入时,每个单词之间都必须添加空格,无形中增加了不少输入负担。 在词汇量和记忆...

    仿榕树下论坛RSBBS多语言精简版 v2.2

    综上所述,《仿榕树下论坛RSBBS多语言精简版 v2.2》是一款集多功能、多语言、个性化于一体的论坛解决方案。无论是对于个人兴趣小组,还是企业内部交流,甚至是面向全球用户的大型社区,它都能提供稳定、高效的运营...

    网站设计布局策划书-2.doc

    从给定的文件信息来看,该文档主要围绕两个核心项目展开:一是广州恒大球迷媒体中心官网的策划;二是湖北荣恩堂酒业有限公司新网站的设计与布局。以下将针对这两个项目的关键知识点进行详细解读。 ### 广州恒大球迷...

    DISCUZ婚嫁 家居 美食 门户 汽车 亲子模板UTF8下载.rar

    接着,我们来看一下模板的分类: 1. **婚嫁**:这类模板通常设计精美,色彩温馨浪漫,适合用于创建婚礼相关的讨论区或者婚纱摄影工作室的官方网站,提供婚礼筹备、婚纱摄影、婚礼故事分享等内容。 2. **家居**:...

    玉饰设计与制作实训教学研究.doc

    第一步为“看”,即通过实物或多媒体展示教学样品。这个步骤旨在培养学生对玉饰的视觉感知能力。在教师的引导下,学生全面观察玉饰的造型、色彩、纹理等特点,并学习如何从专业的角度去审视玉饰作品的品质、设计风格...

    模板巴士原创响应式模板

    在当今日益增长的互联网时代,用户体验变得至关...无论是从技术层面还是用户层面来看,这款模板都为现代网站的设计和运营提供了极大的便利。对于广大站长而言,选择这样的模板,无疑是一条省时省力而又高效的成功之路。

Global site tag (gtag.js) - Google Analytics