首页 文章 精选 留言 我的

精选列表

搜索[自我进化],共7131篇文章
优秀的个人博客,低调大师

程序员如何自我学习?阿里资深技术专家这样做

阿里妹导读:互联网信息技术的迭代周期快是有目共睹的,因此,学习、更新知识这件事就变得相当重要。今天,阿里资深技术专家雷卷,将分享自己平时学习的方法和心得,希望能够带给大家一些启发(本文推荐养家糊口之外有点小追求的同学阅读,Ph.D、paper秒懂的学霸同学可自动忽略~)。 为何要持续学习,靠经验积累不行吗? 很多人都说程序员的薪资水平不错,可以媲美医生和律师。而程序员和医生、律师的不同点在于持续学习上。不是说医生和律师不需要学习,医生、律师能够凭之前的case积累非常多的经验(这也是大家看病喜欢找年纪大的医生的原因之一),而且这些经验很大程度上可以被复用(很多病因和判罚案例带有相似性)。 程序员这个职业则不同,主要是因为行业更新得太快,积累的经验很快就不适用了。 举几个例子: 如果你是Java程序员,且非常擅长Struts + JSP开发

优秀的个人博客,低调大师

云原生时代的运维体系进化

作者 | 易立 云原生已经成为数字经济技术的创新基石,并且正在深刻地改变企业上云和用云的方式。云原生的用云方式可以帮助企业最大化获得云价值,也给企业的计算基础设施、应用架构、组织文化和研发流程带来新一轮变革。而业务和技术挑战也催生了新一代云原生运维技术体系。 本文整理自阿里云资深技术专家、容器服务研发负责人易立在阿里云联合主办的“2021云上架构与运维峰会”中的演讲实录,分享了云原生时代运维技术发出的重要改变,以及源自阿里云超大规模云原生应用发展进程中的CloudOps实践。 新商业带来新机遇与新挑战 阿里云对云原生的定义是因云而生的软件、硬件和架构,帮助企业最大化获得云价值。云原生技术带来的变化包含几个维度: • 首先是计算基础设施的变化,包含虚拟化、容器、函数计算的新的计算形态,帮助应用高效地运行在公共云、私有云、边缘云等不同的云环境。 • 其次是应用架构的变化。利用微服务、服务网格等技术帮助企业构建分布式、松耦合、高弹性、高容错的现代化应用。 • 最后是组织、文化和流程的变化。比如 DevOps、DevSecOps、FinOps、 SRE 等理念持续推动现代化的软件开发流程和组织升级。 回顾云原生出现的时代背景,移动互联网的出现改变了商业的形态,改变了人与人沟通的方式,让任何人在任何时间、任何地点都可以轻松获取自己所需的服务。IT 系统需要能够应对互联网规模的快速增长,并且能够快速迭代、低成本试错。 以 Netflix、阿里为代表的一系列互联网公司推动了新一代应用架构的变革,Spring Cloud、Apache Dubbo 等微服务架构应运而生。微服务架构解决了传统单体式应用存在的几个问题:每个服务可以独立部署和交付,大大提升了业务敏捷性;每个服务可以独立横向扩容,应对互联网规模的挑战。 与传统单体应用相比,分布式的微服务架构具备更快的迭代速度、更低的开发复杂性和更好的可扩展性。但同时,它的部署和运维的复杂性却大大增加。我们需要如何应对? 此外,“脉冲”计算成为常态。比如双十一大促期间,零点需要的算力是平时的数十倍;一个突发的新闻事件,可能让上千万用户涌向社交媒体。云计算无疑是处理突发流量洪峰的更加经济、高效的方式。如何上好云、用好云、管好云,如何让应用可以更加充分利用基础设施的弹性,成为企业运维团队的关注重点。这些业务和技术挑战也催生了云原生的运维技术体系 – CloudOps。 云原生时代运维技术变革 1、云原生运维解决之道 CloudOps 要解决几个关键问题: • 标准化:标准化可以促进开发团队与运维团队的沟通和协同,标准化也有助于生态分工,推动更多自动化工具的出现。 • 自动化:只有自动化运维,才能支撑互联网规模的挑战,才能持续支撑业务的快速迭代与稳定性。 • 数智化:数据化、AI 增强的自动化运维成为未来发展的必然趋势 2、容器 “应用集装箱”重塑软件供应链 在传统的应用分发、部署过程中,常会由于缺乏标准导致工具碎片化,比如 Java 应用和 AI 应用的部署,需要完全不同的技术栈,交付效率低。此外,为了避免应用之间的环境冲突,我们经常需要将每个应用单独部署在一个独立的物理机或者虚拟机上,这也造成了很多资源浪费。 2013 年开源的容器技术 Docker 出现,开创性地提出了基于容器镜像的应用分发和交付方式,重塑了软件开发、交付和运维的整个生命周期。 就像传统的供应链体系为例,不管什么样的产品都是通过使用集装箱来进行运输,极大提升了物流效率,使得全球化的分工协同成为可能。 容器镜像将应用和其依赖的应用环境一同打包。镜像可以通过镜像仓库进行分发,可以一致的方式运行在开发、测试和生产环境中。 容器技术是一种轻量化 OS 虚拟化能力,可以提升应用部署密度,优化资源利用率,与传统的虚拟化技术相比,更加敏捷、轻量,具备更好的弹性和可移植性。 容器作为云时代的“应用集装箱”,重塑了整个软件供应链,也开启了云原生技术浪潮。 3、容器技术加速不可变基础设施理念落地 在传统的软件部署和变更过程中,经常会出现因为环境间的差异导致应用出现不可用的问题。比如,新版本应用需要依赖 JDK11 的能力,而如果部署环境中没有更新 JDK 版本,就会导致应用失败。“It works on my machine”也成了开发人员打趣的口头禅。而且随着时间的推移,系统的配置已经不可考,采用原地升级的方式在变更的时候一不留神就会掉进坑里。 不可变基础设施(Immutable Infrastructure)是由 Chad Fowler 于 2013 年提出的一个理念,其核心思想是“任何基础设施实例一旦创建,就变成为只读状态,如需要修改和升级,则使用新的实例进行替换。” 这种模式可以减少配置管理的复杂性,确保系统配置变更可以可靠地、重复地执行。而且一旦部署出错时可进行快速回滚。 Docker 和 Kubernetes 容器技术正是实现 Immutable Infrastructure 模式的最佳方式。当我们为容器应用更新一个镜像版本的时候,Kubernetes 会新创建一个容器,并且通过负载均衡将新请求路由到新容器,然后销毁老容器,这避免了令人头疼的配置漂移问题。 4、Kubernetes:分布式资源调度的标准及 CloudOps 最佳载体 目前,容器镜像已经成为了分布式应用交付的标准。Kubernetes 已经成为了分布式资源调度的标准。 越来越多的应用,通过容器方式进行管理、交付:从无状态的 Web 应用,有状态的数据库、消息等应用,再到数据化、智能化应用。 CNCF 2020 年调查报告指出,55%的受访者已经在生产中的容器中运行有状态应用;Gartner 预测到 2023 年,70%的 AI 任务会通过容器或 Serverless 模式构建。 对比一下经典的 Linux 操作系统和 Kubernetes 的概念模型,他们的目标都是向下封装资源,向上支撑应用,提供了标准化的 API 来支持应用生命周期,并且提升应用的可移植性。 不同的是,Linux 的计算调度单元是进程,调度范围限制在一台计算节点。而 Kubernetes 的调度单位是 Pod 一个进程组,它的调度范围是一个分布式集群,支持应用在公共云、专有云等不同环境间进行迁移。 对于运维团队而言,Kubernetes 成为实现 CloudOps 理念的最佳平台。 首先是 K8s 采用声明式 API,让开发者可以专注于应用自身,而非系统执行细节。比如,在 Kubernetes 之上,提供了 Deployment、StatefulSet、Job 等不同类型应用负载的抽象。声明式 API 是云原生重要的设计理念,有助于将系统复杂性下沉,交给基础设施进行实现和持续优化。 此外,K8s 提供了可扩展性架构,所有 K8s 组件都是基于一致的、开放的 API 进行实现和交互。开发者也可通过 CRD(Custom Resource Definition)/ Operator 等方式提供领域相关的扩展,极大拓宽了 K8s 的应用场景。 最后,K8s 提供平台无关的技术抽象:如 CNI 网络插件, CSI 存储插件等等,可以对上层业务应用屏蔽基础设施差异。 5、为什么是 Kubernetes? Kubernetes 的成功背后的魔法就是控制循环,Kubernetes 有几个简单的概念。 首先,一切都是资源,通过控制器对资源进行自动化管理。 用户可以声明资源的目标状态。当控制器发现资源当前状态与目标状态存在不一致,就会持续调整,让资源状态趋近于目标状态。通过这个方法,可以统一处理各种情况,比如,根据调整应用副本数进行扩缩容,或者节点宕机后应用自动迁移,等等。 正因如此,Kubernetes 支持资源范围已经远超容器应用。比如服务网格,可以对应用通信流量进行声明式管理;Crossplane 可以利用 K8s CRD 对 ECS,OSS 等云资源进行管理和抽象。 6、云原生应用自动化管理探索与开源实践 K8s 控制器 “把复杂留给自己,把简单交给用户”的理想非常美好,然而实现一个高效、健壮的控制器却充满技术挑战。 OpenKruise 是阿里云开源的云原生应用自动化管理引擎,也是捐献到 Cloud Native Computing Foundation (CNCF) 下的沙箱项目。它来自阿里巴巴多年来容器化、云原生的技术沉淀,解决容器应用在大规模生产环境的自动化和稳定性挑战。 OpenKruise 提供了增强的应用灰度发布,稳定性防护,Sidecar 容器扩展等多种能力。 OpenKruise 开源实现和集团内部版本代码保持一致。支撑了阿里集团应用 100%云原生化,也已经在苏宁、OPPO、小米、Lyft 等企业得到广泛应用。欢迎大家社区共建和使用反馈。 7、GitOps:声明式 API 催生的应用交付流程与协同新方式 基础架构即代码(Infrastructure-as-Code,IaC)是一种典型的声明式 API,它改变了云上资源管理、配置和协同的方式。利用 IaC 工具,我们可以将云服务器、网络和数据库等不同云资源进行自动化的创建、组装和变配。 将 IaC 概念进行延伸,可以覆盖整个云原生软件的交付、运维流程,即 Everything as Code。本图列出来云原生应用涉及的各种模型,从基础设施、到应用定义、到应用交付管理和安全体系,我们都可以通过声明式方式对应用的配置进行管理。 比如,我们可以通过 Istio 来对应用流量切换进行声明式处理,可以利用 OPA(Open Policy Agent)来定义运行时安全策略等等。 更近一步,我们可以将应用的所有环境配置都通过源代码控制系统 Git 进行管理,并通过自动化的流程进行交付和变更。这样就是 GitOps 的核心理念。 首先,从应用定义到基础设施环境,所有的配置都以源代码的方式保存在 Git 中;所有变更、审批记录也记录在 Git 的历史状态中。这样 Git 成为 sourceof truth,我们可以追溯变更历史、可以回滚到指定版本。 GitOps 与声明式 API、不可变基础设施相结合,保障了应用环境的可复现性,提升了交付与管理效率。GitOps 在阿里集团已经被广泛使用,在阿里云容器服务 ACK 中也有支持。目前 GitOps 开源社区也在不断完善相关的工具和最佳实践,大家可以关注相关进展。 8、云原生催生稳定性思想变革 分布式系统存在高度复杂性,在应用、基础设施、部署过程中任何一个地方的问题,都可能导致业务系统的故障。 面对这样的不确定性风险,我们有两种做法:一种是“听天由命”,信佛祖,不宕机;一种是通过系统化的方法进行主动出击,提升系统的确定性。 2012 年,Netflix 提出了“混沌工程”的理念,通过主动注入故障的方式,提前发现系统的薄弱环节,推进架构的改进,最终实现业务韧性。我们可以将混沌工程的工作方式比作疫苗,通过“接种灭活疫苗”的方式,让我们的免疫系统受到锻炼,具备抵挡 “疾病” 的能力。 阿里双十一购物节的顺利成功,离不开全链路压测等对混沌工程的大规模实践,为此阿里团队在这个领域积累了丰富的实战经验。 ChaosBlade 是一组遵循混沌工程理念的实验工具,具有场景丰富、简单易用等特点,已经成为 CNCF 沙箱项目。它支持 Linux、Kubernetes、Docker 等不同运行环境,以及 Java、NodeJS、C++、Golang 等多种语言。内置了 200 多个场景的测试方案。 chaosblade-box 是新引入的混沌工程控制台,可实现实验环境平台化管理,进一步简化用户体验,降低使用门槛。欢迎大家加入 Chaosblade 社区共建,也可以使用阿里云应用高可用服务 AHAS 云服务。 云原生 CloudOps 之路 最后我将结合阿里实践,介绍我们在 CloudOps 上的一些探索。 在传统组织中,开发和运维角色是严格分开的。而不同业务线也构建了一个一个的烟囱化架构,从基础设施环境与运维,到应用运维与开发,都是独立的团队,缺乏良好的协同与复用。 云时代的到来也在改变着现代 IT 组织和流程。 首先,公共云、专有云成为了不同业务部门间共享的基础设施。 然后,SRE (Site ReliabilityEngineering)理念开始得到广泛接受。是通过软件和自动化手段,来解决系统的运维复杂性和稳定性问题。由于 Kubernetes 的标准化、可扩展性和可移植性等优势,越来越多企业的SRE团队基于 K8s 管理云环境,极大提升了企业运维效率与资源效率。 在此之上,平台工程团队开始浮现,基于 Kubernetes 构建企业的 PaaS 平台和 CI/CD 流程,支持中间件和不同业务部门的应用部署与运维。提升企业的标准化和自动化水平,进一步提升应用研发、交付效率。 这样的分层结构中,向下的团队更多是通过 SLO 驱动,从而让上层系统对底层依赖技术具备更好的可预期性。越向上的团队更多是业务驱动,更好地支撑业务发展。 1、阿里云容器服务 SRE 团队的最佳实践 阿里云容器服务 SRE 团队一直也在践行 CloudOps 的最佳实践,简单总结如下: 第一项是全局稳定性架构设计,让整个平台防范与未然: • 首先 Securityby-design:让系统做到默认安全,同时通过安全软件供应链保障全生命周期安全 • 其次 Designfor failure:控制爆炸半径、提供限流/降级手段降低故障影响面 • 第三 Designfor automation:类似扩缩容、故障恢复等工作尽可能自动化完成 • 最后 Observabilityby-design:为每个生产应用定义 SLO,并建立相关的可观测性体系,持续关注请求量,延迟、错误数、饱和度等黄金指标 第二项是建设稳定性应急体系,也就是我们日常所说的 1-5-10 快恢能力,它包含: • 1 分钟发现 - 包括通过黑盒、白盒监控能力 • 5 分钟定位 - 提供诊断大盘,利用工具实现自动化根因定位 • 10 分钟止损 - 包含系统化的预案的设计与持续积累,和自动化预案执行 最后一项是日常稳定性保障,主要包含: • 变更管理规范化 – 所有发布做到可灰度、可监控、可回滚 • 问题跟踪流程化 - 凡事有交代,件件有着落,做一个靠谱青年 • 故障演练常态化 – 通过巡检、突袭、压测等手段查漏补缺,让故障预案持续保鲜 2、拥抱云原生运维技术体系 云原生已经成为势不可挡的技术趋势。Gartner 预测到 2025 年,95%数字化运维将通过云原生平台进行支撑。 我们可以根据企业能力和业务目标选择合适的迁云之路,大致可以分为几个阶段: • Rehost 新托管:简单地通过 lift-and-shift 方式,将线下物理机替换成为云上虚拟机或者裸金属实例,不改变原有的运维方式。 • Re-platform 新平台:利用托管的云服务替换线下自建应用基础设施,比如通过 RDS 数据库服务替换自建 MySQL,通过阿里云容器服务 ACK 来取代自建 K8s 集群。托管的云服务通常提供更好的弹性、稳定性和自治运维能力,可以让用户关注于应用而非基础设施管理。 • Refactor/Re-architect 重构/新架构:包括对单体应用的微服务架构改造、容器化和 Serverless 化等现代化改造。 从 Rehost、Re-platform 到 Re-architect,我们可以看到迁移的复杂性和所需技能在增加,但是敏捷性、弹性、可用性、容错性等收益也在持续增加。 阿里集团上云也经历了这样的历程,在2020年业务 100%上公共云的基础之上,2021年实现了应用 100%云原生化。帮助阿里业务的研发效率提升了 20%,资源利用率提升了 30%。 最后做一个快速总结。基于容器、Kubernetes 等云原生技术,提供的开放社区标准、不可变基础设施、声明式 API 会成为企业 CloudOps 的最佳实践,也将在这个基础上推进数据化、智能化体系建设,将运维复杂性进一步下沉,让企业可以聚焦于自己的业务创新。阿里云也将持续向外输出自身在超大规模云原生实践和探索中的能力沉淀,与更多企业、开发者一起,躬身入局,全面拥抱云原生运维技术体系。

优秀的个人博客,低调大师

Redis 分布式锁进化史

按:系统架构经过多年演进,现在越来越多的系统采用微服务架构,而说到微服务架构必然牵涉到分布式,以前单体应用加锁是很简单的,但现在分布式系统下加锁就比较难了,我之前曾简单写过一篇文章,关于分布式锁的实现,但有一次发现实现的分布式锁是有问题的,因为出问题的概率很低,所以当时也没在意,前几天和朋友聊这个问题,想起来看过一篇文章,写的不错,今天特转载过来,希望能让更多的人看到,同时也加深一下记忆。原文链接是:http://tech.dianwoda.com/2018/04/11/redisfen-bu-shi-suo-jin-hua-shi/ 以下为原文: 近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redis,Zookeeper,其中基于Redis的分布式锁的使用更加广泛。 但是在工作和网络上看到过各个版本的Redis分布式锁实现,每种实现都有一些不严谨的地方,甚至有可能是错误的实现,包括在代码中,如果不能正确的使用分布式锁,可能造成严重的生产环境故障,本文主要对目前遇到的各种分布式锁以及其缺陷做了一个整理,并对如何选择合适的Redis分布式锁给出建议。 一. 各个版本的Redis分布式锁 1. V1.0 tryLock() { SETNX Key 1 EXPIRE Key Seconds } release() { DELETE Key } 这个版本应该是最简单的版本,也是出现频率很高的一个版本,首先给锁加一个过期时间操作是为了避免应用在服务重启或者异常导致锁无法释放后,不会出现锁一直无法被释放的情况。 这个方案的一个问题在于每次提交一个Redis请求,如果执行完第一条命令后应用异常或者重启,锁将无法过期,一种改善方案就是使用Lua脚本(包含SETNX和EXPIRE两条命令),但是如果Redis仅执行了一条命令后crash或者发生主从切换,依然会出现锁没有过期时间,最终导致无法释放。 另外一个问题在于,很多同学在释放分布式锁的过程中,无论锁是否获取成功,都在finally中释放锁,这样是一个锁的错误使用,这个问题将在后续的V3.0版本中解决。 针对锁无法释放问题的一个解决方案基于GETSET命令来实现 2. V1.1 基于GETSET tryLock() { NewExpireTime = CurrentTimestamp + ExpireSeconds if (SETNX Key NewExpireTime Seconds) { oldExpireTime = GET(Key) if (oldExpireTime < CurrentTimestamp) { NewExpireTime = CurrentTimestamp+ExpireSeconds CurrentExpireTime = GETSET(Key,NewExpireTime) if (CurrentExpireTime == oldExpireTime) { return 1; } else { return 0; } } } } release() { DELETE key } 思路: 1. SETNX(Key,ExpireTime)获取锁 2. 如果获取锁失败,通过GET(Key)返回的时间戳检查锁是否已经过期 3. GETSET(Key,ExpireTime)修改Value为NewExpireTime 4. 检查GETSET返回的旧值,如果等于GET返回的值,则认为获取锁成功 注意:这个版本去掉了EXPIRE命令,改为通过Value时间戳值来判断过期 问题: 1. 在锁竞争较高的情况下,会出现Value不断被覆盖,但是没有一个Client获取到锁 2. 在获取锁的过程中不断的修改原有锁的数据,设想一种场景C1,C2竞争锁,C1获取到了锁,C2锁执行了GETSET操作修改了C1锁的过期时间,如果C1没有正确释放锁,锁的过期时间被延长,其它Client需要等待更久的时间 3. V2.0 基于SETNX tryLock() { SETNX Key 1 Seconds } release() { DELETE Key } Redis 2.6.12版本后SETNX增加过期时间参数,这样就解决了两条命令无法保证原子性的问题。但是设想下面一个场景: C1成功获取到了锁,之后C1因为GC进入等待或者未知原因导致任务执行过长,最后在锁失效前C1没有主动释放锁 2. C2在C1的锁超时后获取到锁,并且开始执行,这个时候C1和C2都同时在执行,会因重复执行造成数据不一致等未知情况 3. C1如果先执行完毕,则会释放C2的锁,此时可能导致另外一个C3进程获取到了锁 大致的流程图 存在问题: 1. 由于C1的停顿导致C1 和C2同都获得了锁并且同时在执行,在业务实现间接要求必须保证幂等性 2. C1释放了不属于C1的锁 4. V3.0 tryLock() { SETNX Key UnixTimestamp Seconds } release() { EVAL ( //LuaScript if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end ) } 这个方案通过指定Value为时间戳,并在释放锁的时候检查锁的Value是否为获取锁的Value,避免了V2.0版本中提到的C1释放了C2持有的锁的问题;另外在释放锁的时候因为涉及到多个Redis操作,并且考虑到Check And Set 模型的并发问题,所以使用Lua脚本来避免并发问题。 存在问题: 如果在并发极高的场景下,比如抢红包场景,可能存在UnixTimestamp重复问题,另外由于不能保证分布式环境下的物理时钟一致性,也可能存在UnixTimestamp重复问题,只不过极少情况下会遇到。 5. V3.1 tryLock() { SET Key UniqId Seconds } release() { EVAL ( //LuaScript if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end ) } Redis 2.6.12后SET同样提供了一个NX参数,等同于SETNX命令,官方文档上提醒后面的版本有可能去掉SETNX, SETEX, PSETEX,并用SET命令代替,另外一个优化是使用一个自增的唯一UniqId代替时间戳来规避V3.0提到的时钟问题。 这个方案是目前最优的分布式锁方案,但是如果在Redis集群环境下依然存在问题: 由于Redis集群数据同步为异步,假设在Master节点获取到锁后未完成数据同步情况下Master节点crash,此时在新的Master节点依然可以获取锁,所以多个Client同时获取到了锁 二. 分布式Redis锁:Redlock V3.1的版本仅在单实例的场景下是安全的,针对如何实现分布式Redis的锁,国外的分布式专家有过激烈的讨论, antirez提出了分布式锁算法Redlock,在distlock话题下可以看到对Redlock的详细说明,下面是Redlock算法的一个中文说明(引用) 假设有N个独立的Redis节点 1. 获取当前时间(毫秒数)。 2. 按顺序依次向N个Redis节点执行获取锁的操作。这个获取操作跟前面基于单Redis节点的获取锁的过程相同,包含随机字符串my_random_value,也包含过期时间(比如PX 30000,即锁的有效时间)。为了保证在某个Redis节点不可用的时候算法能够继续运行,这个获取锁的操作还有一个超时时间(time out),它要远小于锁的有效时间(几十毫秒量级)。客户端在向某个Redis节点获取锁失败以后,应该立即尝试下一个Redis节点。这里的失败,应该包含任何类型的失败,比如该Redis节点不可用,或者该Redis节点上的锁已经被其它客户端持有(注:Redlock原文中这里只提到了Redis节点不可用的情况,但也应该包含其它的失败情况)。 3. 计算整个获取锁的过程总共消耗了多长时间,计算方法是用当前时间减去第1步记录的时间。如果客户端从大多数Redis节点(>= N/2+1)成功获取到了锁,并且获取锁总共消耗的时间没有超过锁的有效时间(lock validity time),那么这时客户端才认为最终获取锁成功;否则,认为最终获取锁失败。 4. 如果最终获取锁成功了,那么这个锁的有效时间应该重新计算,它等于最初的锁的有效时间减去第3步计算出来的获取锁消耗的时间。 5. 如果最终获取锁失败了(可能由于获取到锁的Redis节点个数少于N/2+1,或者整个获取锁的过程消耗的时间超过了锁的最初有效时间),那么客户端应该立即向所有Redis节点发起释放锁的操作(即前面介绍的Redis Lua脚本)。 6. 释放锁:对所有的Redis节点发起释放锁操作 然而Martin Kleppmann针对这个算法提出了质疑,提出应该基于fencing token机制(每次对资源进行操作都需要进行token验证) 1. Redlock在系统模型上尤其是在分布式时钟一致性问题上提出了假设,实际场景下存在时钟不一致和时钟跳跃问题,而Redlock恰恰是基于timing的分布式锁 2. 另外Redlock由于是基于自动过期机制,依然没有解决长时间的gc pause等问题带来的锁自动失效,从而带来的安全性问题。 接着antirez又回复了Martin Kleppmann的质疑,给出了过期机制的合理性,以及实际场景中如果出现停顿问题导致多个Client同时访问资源的情况下如何处理。 针对Redlock的问题,基于Redis的分布式锁到底安全吗给出了详细的中文说明,并对Redlock算法存在的问题提出了分析。 总结 不论是基于SETNX版本的Redis单实例分布式锁,还是Redlock分布式锁,都是为了保证下特性 1. 安全性:在同一时间不允许多个Client同时持有锁 2. 活性 死锁:锁最终应该能够被释放,即使Client端crash或者出现网络分区(通常基于超时机制) 容错性:只要超过半数Redis节点可用,锁都能被正确获取和释放 所以在开发或者使用分布式锁的过程中要保证安全性和活性,避免出现不可预测的结果。 另外每个版本的分布式锁都存在一些问题,在锁的使用上要针对锁的实用场景选择合适的锁,通常情况下锁的使用场景包括: Efficiency(效率):只需要一个Client来完成操作,不需要重复执行,这是一个对宽松的分布式锁,只需要保证锁的活性即可; Correctness(正确性):多个Client保证严格的互斥性,不允许出现同时持有锁或者对同时操作同一资源,这种场景下需要在锁的选择和使用上更加严格,同时在业务代码上尽量做到幂等 在Redis分布式锁的实现上还有很多问题等待解决,我们需要认识到这些问题并清楚如何正确实现一个Redis 分布式锁,然后在工作中合理的选择和正确的使用分布式锁。

优秀的个人博客,低调大师

视觉技术进化 工业物联网加速落地

近年来智能化成为各产业的热门议题,工业4.0现在已开始进入实质导入阶段,而工业物联网是工业4.0的基础架构,系统建构时必须与现有设备全面串接,随着制造业的厂商规模增大,机台数量势必会越来越多,在整合概念下,各机台之间的通讯互连已是必然.工业物联网的系统建置目标,聚焦于制造业前端设计与后端制程系统,用以提高产线弹性,现在市场上的工业物联网作法有两种,一是设备中建置传感器,传感器可快速判断工件的类别,改变生产方式,不过一旦所需处理的工件种类变多,这需要系统复杂度也必须同步提升,另一是将产线系统设备模块化,一旦产品或制程将产线拆开重组,即可组装成适合的生产系统。这两种方式都会牵涉到不同系统的整合,一是视觉技术,品管是最后产品质量最后把关的环节,在机器视觉技术未臻成熟之前,过去一向以人力为主,以太阳能、LED产业为例,就有超过20%的人力投注在此,不过产品检测单调且冗长的作业模式,容易使操作者出现疲劳、注意力分散等问题,现在机器视觉技术逐渐精进,足以担当产品检测重任,因此可以被导入产线以提高了产能、降低成本。目前机器可视化的检测作法,是将视觉传感器与镜头,直接建在系统设备上,当产品传送至该站时,即可被检测,这种作法的好处是可以全检,不像一般用抽检的方式,产品质量可全面获得保障,另一个优点是速度快,可加快检测速度。视觉检测是现代自动化系统相当重要的部份,而此一技术也是现代与传统自动化的主要差异,20年前机器视觉因技术尚未成熟,与自动化系统整合的难度相当高,就算整合进去,判别速度也有限,不过随着视觉演算、判断法则的进步,再加上现在PC的强大功能,未来视觉检测会大量应用在各类制程。就整个历程来看,视觉检测在2000年开始被大量应用,当时主要应用领域是PCB(Printed Circuit Board;印刷电路板)与FPD(Flat Panel Display;平面显示器),不过主要都用来做瑕疵检测,随着技术进步,现在的视觉检测功能已不再只局限于此,包括尺寸检测与颜色、条形码、车牌等辨识都已能胜任,其应用也仍不断扩大,例如以前立体工件的量测,必须将对象放至3D设备进行扫描,不过这类扫描会有尺寸限制。另外,现在视觉技术也可用来进行定位与尺寸的量测,例如工研院机械所就曾接过马达厂的案子,利用视觉技术检测马达内的线圈,由于受测马达的线圈相当大,整体长度超过2公尺,这种产品对于尺寸的准确度要求相当高,因此在绕线完后,必须确定尺寸的正确与否?对此,工研院就特别开发专属机台,用视觉检测大型马达线圈尺寸,马达的尺寸量测非常复杂,不仅是3D量测,还有曲度、各个旋转的R角等,这些复杂的尺寸量测,以前用人工,光是一个线圈就需要数小时,而机械所开发的机台,只要在2~3分钟可完成,大幅提升了量测效率。另一种视觉应用是与机器人整合,进行定位、导引,过去机器人动作时,因没有视觉配合,必须事先规划行径路线,因此应用不但大为受限且缺少弹性,若工件规格有所变化,就必须更改程序,在机器人身上加入视觉装置后,由视觉传感器可回馈讯号,让机器人自主判断工件的形状、颜色、位置,即便尺寸、位置更动,也不必重写程序,如此将可大幅提升自动化产线的弹性。在制程监控方面,工业物联网系统可透过感测技术进行节能与效率两种监控,由于这方面的监测,其物理量通常都不太好量,因此多采间接量测,例如工具机里的切削力量测,不是将传感器设置在基座就是在刀具底部,再利用推论模式推测出所要的数值,这种推论模式,是利用过去累积的数据,来预测下一步的状况,以进行控制、补偿,藉以提升准确率。监测部份,现在业界的研发走向是设备预诊,此作法除了建有历史数据库外,还可依据数据库进行预测,例如若发现系统性能除线问题,就可由此系统推算出可能出错的系统环节,这种预测诊断的功能,主要是根据既有数据来预测系统未来的性能与状况,并诊断系统中未来的可能损坏部位与时间,让设备厂商可提前备料、维修,这类系统在大型设备如核能、大型风力发电等相当常见,一般来说,越大型的设备,对预测诊断的系统需求会越高。

优秀的个人博客,低调大师

vGPU作为主流平台的进化之路

针对能够并行利用数百个小核心的应用来说,GPU提供了极大的性能提升。众所周知的用例包括各种形式的图形处理,视频编辑渲染等等—科学计算以及数据流处理,包括大数据分析以及高速通信/存储数据服务。 很多用例针对云计算,但特有的性能需求以及代码复杂性使得该项工作充满挑战而且和云中的通用计算相比多少有些滞后。过渡到聚焦GPU的用例的杀手锏是两年前发布的NVIDIA GRID产品,该产品允许应用在由调配GPU资源的软件所创建的vGPU上运行。 这一特性导致了向Adobe及NVIDIA云端迁移。Adobe交付了视频编辑套件的云端版本并开始反对得到许可的独立版本。典型的编辑配置从需要昂贵软件许可费用的工作站变成了一个在Adobe云中运行的虚拟工作站,使用平板电脑就可以搞定。结果就是视频编辑的进入成本下降,用户量激增,Adobe得以蓬勃发展。 NVIDIA提供了GPU云允许编程人员熟悉沙箱环境。随后,亚马逊Web服务以及其他服务商在其公有云上提供了GPU实例,vGPU现在是一个主流平台。值得一提的是高性能计算在接受云计算方面一直慢一拍,但GPU虚拟化产生的影响已经大大降低了进入价格,受困于超级计算机的研究项目能够共享云端资源并访问新的计算资源。预计很多项目的时间进度能够提高50%乃至更多。 2016年初,AMD加入了vCPU竞赛。AMD采用的是硬件而非软件方式处理多租户问题,至少在理论上提供了与多租户虚拟机共享CPU资源同样的安全级别。AMD声称性价比超过了NVIDIA,但过去两家公司的性能测试报告一直不分伯仲。 AMD的产品开启了开放计算语言作为云中并行计算应用语言加入CUDA的大门,因此我们应该会在不久后看到某些激烈的竞争以及价格战。 当今GPU虚拟化的热门用例似乎是虚拟桌面基础设施(VDI)。并非购买并支持大量的桌面PC,我们看到了企业转向移动设备并使用浏览器显示基于云服务器的虚拟桌面结果的一个临界点。这与Adobe软件类似,而且后续的成本及支持需求值得注意。最终的虚拟桌面应该能够利用容器提高服务器利用率。 VDI用例背后是由vGPU实例所支撑的大数据分析处理的增长。GPU非常适合解决Hadoop问题,因此公有云以及混合云将需要使用vGPU武装自己。 使用GPU实现存储以及网络数据服务比如压缩、重复数据删除以及校验码的研究工作变得越来越紧迫了,我们开始实现固态硬盘10Gb/s的传输速率才不到一年的时间,但200Gb以太网可能会在2018年问世。CPU发展速度跟不上而且硬件加速还不够灵活。使用vGPU执行各种存储、网络微服务可能很有意义而且可能是解决软件定义基础设施所面临的困境的一种方式。 vGPU仍旧在完善过程中而且可以预计在今后的两年当中会有提供新功能,性能也会有所提升。AMD目前仅支持VMware的hypervisor,而NVIDIA还支持XenServer。Intel提供了一款与NVIDIA类似的产品,支持KVM、XenServer。在细节上,在类别以及资源分布上不同厂商提供的产品有所不同。尽管软硬件产品在多租户控制上会有差异,但我们预计产品支持的范围会趋同。 物联网爆炸式增长以及后续处理非结构化数据需求的增长使得GPU实例在主流计算中变得更加重要,而数据流加速有可能使得GPU在云服务器中无处不在。无论发生什么,做好混合云规划是很有必要的。 本文转自d1net(转载)

优秀的个人博客,低调大师

进化的竞争:机器与人谁淘汰谁?

机器人抢饭碗,人们该怎么做? 腾讯科技讯 7月6日,随着机器人科学和人工智能科技的不断发展,部分劳动力人将被科技所逐渐取代,同时也使大量劳动力人口面临失业风险,这是全球目前所面临的最重要问题之一。而在某些领域,技术进步的同时也让生产有了更高的效率。对此,谷歌(微博)CEO拉里-佩奇(Larry Page)认为:虽然绝大多数人都希望能够自己能够拥有一份工作,但他们对于更轻的工作压力似乎也并不排斥。 佩奇日前在接受Khosla Ventures风险投资公司、被称为硅谷印度裔创业者“教父”的维诺德-科斯拉(Vinod Khosla)采访时表示:“所谓人们都希望疯狂的工作来满足自己欲望的说法并不准确。事实上,现在仍有许多人在做诸如破坏环境这样愚蠢的事情,其实他们在某种程度上是在做一些完全不必要的工作。对此,我们的解决方式不仅仅是大幅度裁员这么

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册