最近分布式系统开发小结

简介:

用最简单的语言梳理一下最近十天做的分布式系统模块的开发。这是一个还在开发中的项目,配图也是设计原图。希望能更多地从开源项目里汲取营养,一边实战,一边积累。


系统概述

最近在设计和开发一个分布式系统的流式处理模块,整个系统用于跨集群、跨机房搬运不同数据源内的数据到另一份或多份数据源上,包括HDFS、MySQl、MongoDB、FTP等。功能比较像Hadoop的Sqoop,但是能扩展支持更多的数据源,且本身是个集群部署,不像Sqoop需要依赖Hadoop的MR。

我们整个cluster的资源管理借助Mesos来完成,由自己定制的Mesos Scheduler向Mesos Master申请可用的资源,具体把数据搬运的任务分发到Mesos Slave的Executor上,而我主要负责的就是Slave模块,包括Slave上Executors的实现、不同Slave上Executor之间的通信、消息处理、每次Task的容错和可靠性等内容。


Executor设计

一共有三种Executors,简单分为Input、Cache、Output,直观理解Input就是读取数据源,Cache用于从input到output的缓存,Output是获取cache里的数据,向目标数据源

导出数据。

Executor具体涉及到下面一些问题:

1.      Executor之间的网络通信

2.      数据流里每个Tuple在网络中的序列化、压缩等流通问题

3.      消息队列

4.      其他:多线程、双队列缓存设计、状态记录等

我们还具体考虑了Input、Cache、Output分别挂掉要怎样继续去执行整个数据流的搬运,这里涉及到了把一些描述和状态更新统一写到Zookeeper里,需要Cache模块做对消息的钝化/checkpoint/JournalLog。

整个模块的设计图如下:


网络通信

Netty有很优雅的设计,封装了Java的网络NIO接口,还重写了ChannelBuffer。利用Netty框架,Executors之间的通信简化为下面这样的模式:

我今天参考了Storm0.9.0里新增加的Netty模块,优化了下Slave模块里的Netty部分。其实Storm里的Netty部分蛮简单,比较我们想要做的实现更简单,主要体现在两处:

1.  Cache作为Netty Server,既要接收InputClient的写,又要接受OutputClient的读请求。

2.  Cache交互的Queue不是一个java concurrent包里的某个Queue容器,而是一个轻量级的workqueue:beanstalkd

消息队列

采用的是beanstalkd,每个tube对应一个output,之前的博文介绍了beanstalkd。


数据流通

数据的序列化和反序列化,本来想要使用kryo这样的在开源软件中经常见到的高效工具。后来参考了Storm里的TaskMessage结构,发现不如直接把POJO设计成一个byte[],自己定义一下byte数组的结构来的更高效。毕竟一个java对象转bytes,再高效也不如直接拼byte[]快。

数据压缩方面Snappy有很快的压缩速度。

Storm设计参考

其实我们的Input比较像Storm的spout,Cache和Output比较像bolt,但是又没有Storm里的shuffle grouping等机制,Input与Cache是指定的一对一的,Cache与Output是一对多,而这些对应关系会在物理执行计划模块里生成。

在Storm的设计里,参考了它的Acker。Storm能保证消息不会丢失,并且每条消息都会被完整处理,即这个tuple以及由这个tuple所导致的所有的tuple都被成功处理。而一个tuple会被认为处理失败了如果这个消息在timeout所指定的时间内没有成功处理。能做到这点,他的Acker起到了很重要的作用。(Arker模块的设计和源码分析)

我们打算做一个Acker模块,但消息的执行状态和更新会写在znode上,让Arker模块与ZK打交道,然后去更新Beanstalkd里已经reserve了的job。有时间还要把Storm的源码和模块仔细读读,尽量能多参考一些设计思路。

 

(全文完)

目录
相关文章
|
4月前
|
消息中间件 NoSQL Java
Java高级开发:高并发+分布式+高性能+Spring全家桶+性能优化
Java高架构师、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师之路
|
8月前
|
存储 SQL NoSQL
HarmonyOS学习路之开发篇—数据管理(分布式数据服务)
分布式数据服务(Distributed Data Service,DDS) 为应用程序提供不同设备间数据库数据分布式的能力。通过调用分布式数据接口,应用程序将数据保存到分布式数据库中。通过结合帐号、应用和数据库三元组,分布式数据服务对属于不同应用的数据进行隔离,保证不同应用之间的数据不能通过分布式数据服务互相访问。在通过可信认证的设备间,分布式数据服务支持应用数据相互同步,为用户提供在多种终端设备上最终一致的数据访问体验。
|
21天前
|
NoSQL Java Redis
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件(二)
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件
14 0
|
21天前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
26 1
|
3月前
|
缓存 NoSQL Java
毕业季-Java分布式开发面试题
毕业季-Java分布式开发面试题
|
7月前
|
消息中间件 前端开发 Java
GitHub标星30k!基于Spring MVC Mybatis分布式开发系统-zheng项目
zheng项目不仅仅是一个开发架构,而是努力打造一套从 前端模板 - 基础框架 - 分布式架构 - 开源项目 - 持续集成 - 自动化部署 - 系统监测 - 无缝升级 的全方位J2EE企业级开发解决方案。
|
7月前
|
安全 物联网 程序员
学完阿里大牛分享的685页分布式系统开发实战文档直接入职蚂蚁
自20世纪40年代计算机诞生以来,计算机以及互联网呈现出高速发展的趋势。当今的互联网包含以下特征。
|
8月前
|
存储 缓存 Java
HarmonyOS学习路之开发篇—数据管理(分布式文件服务)
分布式文件服务能够为用户设备中的应用程序提供多设备之间的文件共享能力,支持相同帐号下同一应用文件的跨设备访问,应用程序可以不感知文件所在的存储设备,能够在多个设备之间无缝获取文件。
|
10月前
|
安全 Java Serverless
65w字!阿里分布式开发小册Github新开源!原理实践双飞
我们都知道传统的集中式系统已无法满足当今的互联网三高需求,所以现在的系统架构都是向着分布式系统不断演进。同时,越来越多的企业选择通过云的方式发布和部署应用,这也大大促进了分布式系统的发展。未来将是分布式系统“爆发”的时代。
|
11月前
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29631 51

热门文章

最新文章