ZStack--可拓展性秘密武器3:无锁架构

ZigBee协议栈 -- Zstack协议栈(Zstack2.5.1a) CC2530 芯片由 TI 出品,在硬件上和支持 ZigBee 协议;同时 TI 提供的 ZStack 协议栈则是一套符合 ZigBee 协议的协议栈,本篇所讲的CC2530 协议栈即为 TI ZStack 协议栈。 阅读详情

很多IaaS软件中的任务需要按照顺序执行,例如,当一个启动虚拟机的任务正在运行时,关闭同一台虚拟机的任务必须等候前面开启虚拟机的任务完成。另一方面,一些任务应该支持并行完成;例如,20个在同一台主机上创建虚拟机的任务可以同时运行。在一个分布式系统中同时实现串行化和细粒度的并行化并不容易,这通常需要借助分布式调度软件。面对挑战,ZStack提出基于队列的无锁架构,使得任务本身可以简单的控制他们的并行化等级为1(串行的)…N(并行的)。

动机

好的IaaS软件应该能对任务的串行化和并行化进行细粒度的控制。通常,因为任务之间有依赖关系,任务希望以特定的序列被执行。比如,如果当一个对某个磁盘进行快照的任务正在运行时,那么删除该磁盘的操作不能被执行。有些时候,为了提升性能,任务应该被并行地执行;比如,在同一台主机上有十个创建虚拟机的任务,这些任务可以同时运行并不会产生任何问题。然而,如果不进行合理的控制,并行化会对系统造成一定的伤害;比如,1000个在一台主机上创建虚拟机的并发任务,将毫无疑问的摧毁整个系统,或者导致整个系统长时间没有任何回应。这种并发编程问题在多线程的环境中是复杂的,并且在分布式系统环境中将更加复杂。

问题

教科书教导我们解决同步和并行问题的答案锁(lock)和信号量(semaphore)。在分布式系统中为了解决此问题,一个直接的想法是使用一些类似Apache ZooKeeper的分布式调度软件或一些基于Redis的类似软件。拿ZooKeeper来举例子,使用分布式调度软件的概览如下:

在这里插入图片描述

问题在于,当使用锁和信号量的时候,一个线程需要去等待其他线程释放他们所持有的锁或者信号量。在“ZStack可拓展性秘密武器1:异步架构”中我们阐述了ZStack是一个异步的软件,没有线程将因为等待其他线程的完成而被阻塞,所以使用锁和信号量并不是一个可行的方案。我们也关注使用分布式调度软件后,系统的复杂度和可拓展性。假设一个系统充满了10000个需要锁的任务,这并不方便处理、拓展性也不强。

     同步(Synchronous)与串行化(Synchronized):在“ZStack可拓展性秘密武器1:异步架构”中,我们讨论同步(Synchronous)和异步,在这篇文章中,我们将讨论串行化(Synchronized)和并行化,同步(Synchronous)与串行化(Synchronized)某些时候是可以互换的,但是他们是不同的,在我们的文档中同步(Synchronous)是指一个任务将会在运行时阻塞线程,而串行化(Synchronized)是指一个任务执行时是互斥的。如果一个任务一直占用一个线程直到任务完成,它是同步的(Synchronous)任务。如果一个任务在其他任务执行时不能被同时执行,它是串行的(Synchronized)任务。

无锁架构的基础

     无锁架构的基础是一致性哈希算法,因为一致性哈希算法保证了对应同一资源的所有消息,总是被同一服务实例处理。这种聚合消息到特定节点的做法,降低了同步与并行化的复杂度,因为处理环境从分布式系统变为多线程。(详见“ZStack可拓展性秘密武器2:无状态服务”)。

在这里插入图片描述

工作流:传统而又清楚的解决方案

备注:在深入讲解细节之前,请注意我们将要讲的队列和“ZStack可拓展性秘密武器2:无状态服务”中提到的RabbitMQ的消息队列是没有任何关联的。消息队列就是RabbitMQ的一个术语,ZStack的队列指的是内部的数据结构。

因为ZStack是消息驱动的,聚合消息使得相关联的任务在同一节点执行,避免了需要使用线程池进行并发编程的经典问题。为了避免竞争锁,ZStack将使用工作队列而不是锁和信号量的方式。串行的(synchronized)任务以工作队列的方式保存在内存中,最终一个个的被执行。

在这里插入图片描述

工作队列在保存任务的同时也保存并行度,使得并行的任务能以一个定义好的并行度执行。下面的例子展示了一个并行度为4的队列。

在这里插入图片描述

备注:串行的(synchronized)和并行的任务都可以被工作队列执行,当并行度等于1的时候,队列是串行的(synchronized);并行度大于1的时候,队列是并行的;并行度等于0的时候,队列的并行度不被限制。

基于内存的同步队列

在ZStack中有两种类型的工作队列;一种是同步的(synchronous)工作队列,即一个任务(通常是一个Java 可执行程序)在它返回后才被认为已经完成。

thdf.syncSubmit(new SyncTask() {

@Override

public String getSyncSignature() {

    return "api.worker";

}



@Override

public int getSyncLevel() {

    return apiWorkerNum;

}



@Override

public String getName() {

    return "api.worker";

}



@Override

public Object call() throws Exception {

    if (msg.getClass() ==

APIIsReadyToGoMsg.class) {

        handle((APIIsReadyToGoMsg) msg);

    } else {

        try {

dispatchMessage((APIMessage) msg);

        } catch (Throwable t) {

            bus.logExceptionWithMessageDump(msg, t);

            bus.replyErrorByMessageType(msg, errf.throwableToInternalError(t));

        }

    }

    /* When method call() returns, the next task will be

proceeded immediately */

    return null;

}

});

强调:在同步(synchronous)队列中,一个Runnable.run()返回后,工作线程将继续抓取下一个可执行程序,一直到整个队列为空时,该线程将被放回线程池。因为任务将一直占用一个工作线程,所以队列是同步的(synchronous)。

基于内存的异步队列

另一种异步工作队列的方式指的是,当任务发布了一个完整的通知,就被认为已经完成。

thdf.chainSubmit(new ChainTask(msg) {

@Override

public String getName() {

    return String.format("start-vm-%s", self.getUuid());

}



@Override

public String getSyncSignature() {

    return

syncThreadName;

}



@Override

public void run(SyncTaskChain

chain) {

    startVm(msg, chain);

    

    /* the next task will be proceeded only after startVm()

method calls chain.next() */

}

});

强调:因为使用异步队列,ChainTask.run(SyncTaskChain chain)方法可能在做完一些异步操作后立即返回,比如说,发送了一个注册回调函数的消息。在run()方法返回后,工作线程立即返回到线程池;然而,工作线程返回的时候,任务并没有被完成,在队列中的任务直到前一个任务发出了一个通知(比如说调用SyncTaskChain.next()函数)后才可以被运行,因为任务本身不会阻塞工作线程,不会让它等到任务本身完成,所以队列是异步的。

限制

虽然基于无锁架构的队列能99.99%的解决一个管理节点内的串行和并行问题,一致性哈希算法会导致系统进入混乱的状态:一个新加入的节点将因为一致性哈希算法接管临近节点的一部分工作。

在这里插入图片描述

在这个样例中,node 3新加入后,之前在node2上的一部分任务将转移到node3上,在这个时候,如果一个与某资源相关的旧任务仍然运行在node2上,但是与同一资源相关的新任务被提交到node3中,这种情况下就会发生混乱。然而,情景并没有想象的那么糟糕。首先,互相冲突的任务在一个正常的系统中很少存在,比如,一个健壮的UI应该不允许你在启动一台虚拟机的同时关闭这台虚拟机。第二,每一个ZStack的资源有他们的状况(state)/状态(status),如果任务开始的时候,资源处于错误的状况/状态,这将会导致报错。比如,如果一个虚拟机在停止状态,给该虚拟机绑定磁盘的任务将立即返回错误。第三,处理很多任务传输的代理(agents),有一个附加的串行机制;例如:尽管我们在管理节点上已经有了云路由的工作队列,云路由代理(agent)将串行所有修改DHCP配置文件的请求。最后,提前规划好操作是持续管理云的关键,操作组可以在启动云之前启动足够的管理节点,如果不需要动态添加一个新的节点,当云在运行的时候添加管理节点的几率是较小的。

总结

本文主要介绍了无锁架构,它是建立在基于内存的工作队列的基础上的。ZStack没有使用复杂的分布式调度软件,尽可能的提升了自己的性能,同时也预防了任务异常的产生。

zstack(四)zstack架构简介 本篇简单介绍一下zstack的架构设计。现在的zstack加入了一个新的模块woodpecher,用于自动化测试。由于本人对这块没有研究过,这里先不讲这个。 阅读详情

相关推荐

TI CC2652P无线MCU深度解析:多协议、低功耗与高集成设计实战

无线微控制器(MCU)是物联网设备的核心,其选型直接影响产品的功耗、成本和开发周期。其工作原理在于集成处理器、射频和专用协处理器,通过异构计算和动态电源管理实现性能与功耗的平衡。这种设计的技术价值在于能够以单芯片方案替代传统的多芯片组合,大幅简化硬件设计,降低系统复杂性和物料成本。在智能家居、工业传感和资产追踪等应用场景中,此类高集成度无线MCU支持蓝牙、Zigbee等多协议并发,并凭借超低待机功耗满足长续航需求。本文以TI CC2652P为例,深入探讨其动态多协议管理(DMM)和传感器控制器等核心特性,为

weixin_30897079的博客 312

ZStack技术介绍

近年来随着互联网业务的迅速发展以及新兴业务激增,业务数据呈现几何倍数增加,传统服务器+存储的竖井式架构已无法很好满足业务发展需求,分布式、云化技术应运而生。越来越多企业采用虚拟化与云计算技术来构建IT系统,提升IT系统的资源利用率以及缩短业务上线周期。但在应用过程中,企业面临如下挑战:1)系统庞大,管理复杂,运维费用持续走高。2)安装部署复杂,硬件来自多厂商,规划、部署、调优需要丰富的经验支撑。3)多厂商设备,售后支持界面多,解决问题慢。

顺其自然~专栏 3720

IaaS开源新项目-ZStack技术架构总览

ZStack 是一个全新的开源 IaaS 软件,吸取OpenStack等前辈的经验,针对各种云的问题重头设计了整套架构,旨在解决IaaS复杂度、稳定性、可伸缩性和灵活性等问题。ZStack 0.6 已经提供了大部分 IaaS 的基本功能,包括:虚拟机管理,存储卷管理,存储卷快照,各种网络服务(DHCP、DNS、SNAT、EIP、PortForward 以及 Security Group)。

ZStack源码剖析之核心库鉴赏——ThreadFacade

本文首发于泊浮目的专栏:https://segmentfault.com/blog... 前言 在ZStack中,最基本的执行单位不仅仅是一个函数,也可以是一个任务(Task。其本质实现了Java的Callable接口)。通过大小合理的线程池调度来并行的消费这些任务,使ZStack这个Iaas软件有条不紊运行在大型的数据中心里。 对线程...

weixin_34082177的博客 226

无锁并行框架Amino -- Concurrent Building Blocks

无锁并行框架Amino -- Concurrent Building Blocks

黑客利器啊D注入工具超酷增强版

啊D注入工具超酷增强版,2012年渗透利器。你们有吗??

zstack的优势和特性

ZStack 凭借其轻量、高效和高度模块化的设计,成为私有云和混合云部署的理想选择。尤其适合资源有限、追求快速部署和易用性的场景。虽然社区生态和第三方插件不如OpenStack丰富,但其简洁的架构和强大的性能足以满足大多数企业需求。ZStack 是一款开源的云计算管理平台,专为私有云和混合云环境设计。其核心目标是为企业提供轻量、高效、易用的云基础设施解决方案。

远方雪的专栏 1187

ZStack深度试用:部署、架构与网络及其与OpenStack的对比

ZStack深度试用:部署、架构与网络及其与OpenStack的对比

ZStack--可拓展性的秘密武器1:异步架构

ZStack的架构使得其中99%的任务能被异步执行。基于这点,ZStack中单一的管理节点可以管理几千台物理服务器,上万台虚拟机,处理成千上万个并发任务。 动机 对于管理大量硬件和虚拟机的公有云而言,可拓展性是一个IaaS软件必须解决的关键问题之一。对于一个大概拥有5万台物理服务器的中型数据中心,预计可能有150万台虚拟机,1万名用户。虽然用户开关虚拟机的频率不会像刷朋友圈一样频繁,但是在某一时刻...

zstack_org的博客 724

飞牛NAS一键部署小雅Emby全家桶:解锁海量影音资源与智能刮削

本文详细介绍了如何在飞牛NAS上通过Docker一键部署小雅Emby全家桶,完美解决传统WebDAV挂载无法刮削元数据的问题。该方案整合了小雅Alist海量影音资源与Emby媒体服务器,通过预下载超百GB元数据包,自动实现海报、简介等信息的完美匹配,打造出精美的个人影音库。部署过程需准备阿里云盘令牌与充足存储空间,并详解了从环境配置、镜像拉取到最终验证的完整步骤及优化技巧。

weixin_28312391的博客 926

TMS320F28377D的sys/bios双核工程配置详解——从零搭建到RAM优化

本文详细解析了TMS320F28377D双核系统在sys/bios环境下的工程配置与RAM优化策略。从开发环境搭建、SYS/BIOS工程创建到双核CMD文件配置,提供了实战技巧和常见问题解决方案,帮助开发者高效实现电力电子控制系统中的双核协作与性能优化。

weixin_28292761的博客 600

ZStack—可拓展性秘密武器2:无状态的服务

每一个ZStack服务都是无状态的,简单的开启一个富余的服务实例然后使之负载均衡,就能实现服务的高可用和可横向拓展;此外,ZStack把所有服务封装进一个称为管理节点的进程中,使得部署和管理服务变得尤其简单。 动机 在“ZStack的可拓展性秘密武器1:全异步架构”中,我们论述了异步的架构使得单一的ZStack管理节点足以承担大多数云的负载量;然而当用户想要去创建一个高可用的生产环境或处理非常大的...

zstack_org的博客 406

oracle两节点RAC,由于gipc导致某节点crs无法启动问题分析

两节点RAC,其中1 节点集群CRS无法启动。经过分析原因为2节点gipcd进程异常,导致节点之间无法正常通信,重启2节点gipcd.bin后问题得以恢复。 从现象来看,是 ora.crsd...

cuibaye0692的博客 4536

ZStack 5分钟 | 核心架构设计特点2:无状态的服务

ZStack是下一代开源的云计算IaaS(基础架构即服务)软件。它主要面向未来的智能数据中心,通过提供灵活完善的APIs来管理包括计算、存储和网络在内的数据中心资源。用户可以利用ZStack快速构建自己的智能云数据中心,也可以在稳定的ZStack之上搭建灵活的云应用场景,例如VDI(虚拟桌面基础架构)、PaaS(平台即服务)、SaaS(软件即服务)等。 上期5分钟和大家分享了ZStack的核心架...

zstack_org的博客 629

5060TI显卡深度学习环境搭建:CUDA12.8与CUDNN9.8.0的完美搭配

本文详细介绍了在Win10系统下为5060TI显卡搭建深度学习环境的最佳实践,重点配置CUDA12.8与CUDNN9.8.0的完美组合。通过优化OpenCV编译选项和YOLOv5环境设置,显著提升模型训练和推理效率,帮助开发者充分发挥5060TI显卡的性能潜力。

weixin_29065791的博客 491

EB TRESOS 29.0.0安装教程用于MCAL配置开发

本文介绍的搭建基于NXP官网提供EB软件,进行基于标准AUTOSAR软件底层驱动配置的开发

qq_53260940的博客 1882

ZStack的伸缩性秘密武器(三):无锁架构

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34302561的博客 150

Spring Cloud Gateway 结合OAuth2提供UAA服务

微服务做用户认证和授权一直都是一个难点,随着OAuth2.0的密码模式被作废,更是难上加难了。今天胖哥群里的一个群友搭建用户认证授权体系的时候遇到了一些棘手的问题,这让胖哥觉得是时候分享一些思路出来了。 两种思路 通常微服务的认证和授权思路有两种: 所有的认证授权都由一个独立的用户认证授权服务器负责,它只负责发放Token,然后网关只负责转发请求到各个微服务模块,由微服务各个模块自行对Token进行校验处理。 另一种是网关不但承担了流量转发作用,还承担认证授权流程,当前请求的认证信息由网关中继给下游

duan18888的博客 652

ZStack源码剖析:如何在百万行代码中快速迭代

本文首发于泊浮目的专栏:https://segmentfault.com/blog... 前言 ZStack是下一代开源的云计算IaaS(基础架构即服务)软件。它主要面向的是未来的智能数据中心,通过提供的API来管理包括计算、存储和网络在内的数据中心的各种资源。跟OpenStack相比,ZStack具有易用、稳定、灵活、超高性能等特点。...

weixin_33895657的博客 290

电商订单系统设计简析(一)

电商所有模块中,订单系统作为最为核心的模块,决定了整个流程能不能顺畅的执行,起着承上启下的作用。相信很多PM都不陌生,到了一家电商公司,总会觉得公司现有的流程有不少问题,因为问题来自四面八方,一下子摸不着到底是哪里出了问题,PM就跟补丁师傅一样,遇到一个补一个。其实很多日常开发和测试提得需求都是表面需求,而这些表面上呈现出的各种问题,都是源自于流程上的不完整或者流程上某个环节上的缺失导致的。订单系...

野蛮非先生的博客 9556

别再盯着那 100 条数据了,RAP OData 分页机制到底在保护什么

摘要: SAP BTP ABAP Environment 的 OData 服务默认采用分页保护机制,未指定 $top 时仅返回100条数据并附带下一页链接。这种设计旨在防止资源滥用,而非服务故障。客户端应遵循OData协议规范,直接使用服务端返回的 next link 进行分页请求,而非自行构造URL。当指定 $top 参数时,若数值超过5000仍会被强制分页。该机制在SAPUI5控件中被自动处理,但自定义客户端需主动实现分页逻辑。对于自定义实体(Custom Entity),开发者需在Query Prov

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 865

2.ZStack的伸缩性秘密武器:无状态服务

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34072159的博客 180

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ZStack OSAL的事件(event)与消息(message)——part1 & part2

ZStack OSAL的事件(event)与消息(message)——part1 本文转载自:http://blog.youkuaiyun.com/ceci_zhou/article/details/9787349 在zstack中,有两种方式在OSAL的任务(task)中添加自定义的功能:事件(event)和消息(message)。 这篇主要讲讲和event有关的事,和

Keep Silence的专栏 7271

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Boost.Lockfree无锁结构

[译] https://beta.boost.org/doc/libs/1_72_0/doc/html/lockfree.html  boost.Lockfree 无锁结构学习

zzb2019的博客 2046

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

无锁数据结构一

lock-free本文对lock-free进行介绍,主要介绍原子性操作,下一篇介绍内存访问控制什么是lock-free 无锁数据结构无锁数据结构的实现主要基于两个方面:原子性操作和内存访问控制方法。下面先记录原子性操作相关知识。原子性操作原子性操作可以简单地分为读写(read and write)、原子性交换操作(read-modify-write,RMW)两部分。原子操作可认为是

紫无之紫的博客 1041

【Zigbee技术入门教程-02】一图读懂ZStack协议栈的核心思想与工作机理

【Zigbee技术入门教程-02】一图读懂ZStack协议栈的核心思想与工作机理 广东职业技术学院 欧浩源 Z-Stack协议栈是一个基于任务轮询方式的操作系统,其任务调度和资源分配由操作系统抽象层OSAL管理着。 你可以理解为:Z-Stack协议栈 = OSAL操作系统 + CC2530硬件模块 + AF无线网络应用 总体来看,Z-Stack协议栈只...

weixin_30954265的博客 1373
上一篇: ZStack—可拓展性秘密武器2:无状态的服务
下一篇: ZStack 混合云+SD-WAN如何创建虚拟专线
普通网友
博客等级 码龄10年 769粉丝 269原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值