用户您好!请先登录!

作者:行走的code

SPI源码解析

什么是SPI

SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。

这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。我们先通过一个很简单的例子来看下它是怎么用的。

1. 示例

首先,我们需要定义一个接口,SPIService

package com.viewscenes.netsupervisor.spi;
public interface SPIService {
    void execute();
}

然后,定义两个实现类,没别的意思,只输入一句话。

阅读更多

WiredTiger存储引擎原理

Mongodb-3.2已经WiredTiger设置为了默认的存储引擎,最近通过阅读wiredtiger源代码(在不了解其内部实现的情况下,读代码难度相当大,代码量太大,强烈建议官方多出些介绍文章),理清了wiredtiger的大致原理,并简单总结,不保证内容都是正确的,如有问题请指出,欢迎讨论交流。

按照Mongodb默认的配置,WiredTiger的写操作会先写入Cache,并持久化到WAL(Write ahead log),每60s或log文件达到2GB时会做一次Checkpoint,将当前的数据持久化,产生一个新的快照。Wiredtiger连接初始化时,首先将数据恢复至最新的快照状态,然后根据WAL恢复数据,以保证存储可靠性。
0102-zyd-MongoDB WiredTiger存储引擎实现原理-1

阅读更多

一致性Hash原理及实现

在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用。

但是普通的余数hash(hash(比如用户id)%服务器机器数)算法伸缩性很差,当新增或者下线服务器机器时候,用户id与服务器的映射关系会大量失效。一致性hash则利用hash环对其进行了改进。

这里结合Redis集群来讲一下一致性Hash的相关问题。

Redis集群的使用

我们在使用Redis的过程中,为了保证Redis的高可用,我们一般会对Redis做主从复制,组成Master-Master或者Master-Slave的形式,进行数据的读写分离,如下图1-1所示:

图1-1:Master-Slave模式

当缓存数据量超过一定的数量时,我们就要对Redis集群做分库分表的操作。

阅读更多

阿里基于HBase的大数据引擎Lindorm

注:Lindorm是阿里内部HBase分支的别称,在阿里云上对外售卖的版本叫做HBase增强版,之后文中出现的HBase增强版和Lindorm都指同一个产品。

2019年以来,Lindorm已经服务了包括淘宝、天猫、蚂蚁、菜鸟、妈妈、优酷、高德、大文娱等数十个BU,在今年的双十一中,Lindorm峰值请求达到了7.5亿次每秒,天吞吐22.9万亿次,平均响应时间低于3ms,整体存储的数据量达到了数百PB。这些数字的背后,凝聚了HBase&Lindorm团队多年以来的汗水和心血。

Lindorm脱胎于HBase,是团队多年以来承载数百PB数据,亿级请求量,上千个业务后,在面对规模成本压力,以及HBase自身缺陷下,全面重构和引擎升级的全新产品。相比HBase,Lindorm无论是性能,功能还是可用性上,都有了巨大飞跃。本文将从功能、可用性、性能成本、服务生态等维度介绍Lindorm的核心能力与业务表现,最后分享部分我们正在进行中的一些项目。

阅读更多

Reactive编程详解 – 1

| 导语 反应式编程是在命令式编程、面向对象编程之后出现的一种新的编程模型,是一种以更优雅的方式,通过异步和数据流来构建事务关系的编程模型。本文包括反应式编程的概述和 RxPy 实战,以及怎样去理解反应式编程才能更好的把它融入到我们的编程工作中,把反应式编程变成我们手中的利器。

1. 反应式编程概述

1.1 背影趋势 

在 google 趋势中搜索反应式编程,可以看到其趋势在 2013 年后一直是往上走的。如图1所示:

640?wx_fmt=png

[ 图1 google 趋势搜索结果 ]

为啥呢?为啥是 2013 年才有明显的变化,因为2013 年后才有可以大范围使用的框架和库出现,才有人专门投入去布道反应式编程这个事情。

阅读更多

官网的Kafka设计准则

没有什么能够比官网给出的解释更权威了,Kafka为什么那么快,支持的吞吐量为什么那么大,集群的支持那么好,一切从官网的学习开始: http://kafka.apache.org/documentation.html

4. DESIGN

4.1 Motivation

We designed Kafka to be able to act as a unified platform for handling all the real-time data feeds a large company might have. To do this we had to think through a fairly broad set of use cases.

It would have to have high-throughput to support high volume event streams such as real-time log aggregation.

It would need to deal gracefully with large data backlogs to be able to support periodic data loads from offline systems.

It also meant the system would have to handle low-latency delivery to handle more traditional messaging use-cases.

阅读更多

微服务不是银弹

大部分时候,微服务都是建立在一种基于请求和响应的协议之上。比如,REST等。这种方式是自然的。我们只需要调用另外一个模块就是了,然后等待响应返回,然后继续。这样的方式确实也满足了我们的很多的场景:用户通过点击页面的一个按钮然后希望发生一些事情。

但是,当我们开始接触许多独立的service的时候,事情就发生改变了。随着service数量急速的增长,同步交互比例也随着service在急速增长。这时候,我们的service就会遇到很多的瓶颈。

于是,不幸的ops工程师们就被我们坑了,他们疲惫的奔波于一个又一个的service,拼凑在一起的二手信息片段,谁说了什么,去往哪里,什么时候发生?等等。。。

这是一个非常典型的问题。市面上也有一些解决方案。一种方案就是确保您的个人服务具有比您的系统更高的SLA。 Google提供了这样做的协议。另一种方法是简单地分解将服务绑定在一起的同步关系。

阅读更多

敏捷101

什么是敏捷?

敏捷是创造并响应变化的能力。这是应对不确定的动荡环境并最终在其上成功的一种方法。

敏捷宣言的作者选择“敏捷”作为整个概念的标签,因为该词代表了对变化的适应性和响应性,这对他们的方法非常重要。

这实际上是在考虑如何才能理解当今环境中的情况,确定面临的不确定性并弄清楚如何适应这种情况。

什么是敏捷软件开发?

敏捷软件开发不仅仅是诸如Scrum,极限编程或功能驱动开发(FDD)之类的框架。

敏捷软件开发不仅限于结对编程,测试驱动的开发,站立,计划会议和冲刺等实践。

阅读更多

12 Principles Behind the Agile Manifesto

Below are the guiding practices that support teams in implementing and executing with agility:

1. Our highest priority is to satisfy the customer through early and continuous delivery of valuable software. (我们的首要任务是通过尽早并持续交付有价值的软件来满足客户。)

2. Welcome changing requirements, even late in development. Agile processes harness change for the customer’s competitive advantage. (即使在开发后期,也欢迎不断变化的需求。敏捷流程利用变更来获得客户的竞争优势。)

3. Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale. (频繁交付工作软件,从几周到几个月不等,而更倾向于缩短时间范围。)

阅读更多

Linux的Cache和Buffer的理解

首先说明,本文讨论的cache指的是Linux中的page cachebuffer指的是buffer cache,也即cat /proc/meminfo中显示的cache和buffer。

我们知道,Linux下频繁存取文件或单个大文件时物理内存会很快被用光,当程序结束后内存不会被正常释放而是一直作为cahce占着内存。因此系统经常会因为这点导致OOM产生,尤其在等大压力场景下概率较高,此时,第一时间查看cache和buffer内存是非常高的。此类问题目前尚未有一个很好的解决方案,以往遇到大多会做规避处理,因此本案尝试给出一个分析和解决的思路。

解决该问题的关键是理解什么是cache和buffer,什么时候消耗在哪里以及如何控制cache和buffer,所以本问主要围绕这几点展开。整个讨论过程尽量先从内核源码分析入手,然后提炼APP相关接口并进行实际操作验证,最后总结给出应用程序的编程建议。

可以通过free或者cat /proc/meminfo查看到系统的buffer和cache情况

阅读更多

Redis哨兵模式和高可用集群解析

Redis 的 主从复制 模式下,一旦 主节点 由于故障不能提供服务,需要手动将 从节点 晋升为 主节点,同时还要通知 客户端 更新 主节点地址,这种故障处理方式从一定程度上是无法接受的。Redis 2.8 以后提供了 Redis Sentinel 哨兵机制 来解决这个问题。

1. Redis高可用概述

在 Web 服务器中,高可用 是指服务器可以 正常访问 的时间,衡量的标准是在 多长时间 内可以提供正常服务(99.9%、99.99%、99.999% 等等)。在 Redis 层面,高可用 的含义要宽泛一些,除了保证提供 正常服务(如 主从分离快速容灾技术 等),还需要考虑 数据容量扩展数据安全 等等。

阅读更多

缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

一、缓存雪崩

缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。

缓存正常从Redis中获取,示意图如下:

缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题

阅读更多

Linux CPU优化实践

Linux性能分析概要

1. 性能指标

随着应用负载的增加,系统资源的使用也会升高,甚至达到极限。而性能问题的本质,就是系统资源已经达到瓶颈,但请求的处理却还不够快,无法支撑更多的请求。
性能分析,其实就是找出应用或系统的瓶颈,并设法去避免或者缓解它们,从而更高效地利用系统资源处理更多的请求。这包含了一系列步骤,比如:

  • 选择指标评估应用程序和系统的性能
  • 为应用程序和系统设置性能目标
  • 进行性能基准测试
  • 性能分析定位瓶颈
  • 优化系统和应用程序
  • 性能监控和告警

阅读更多

不重启JVM,替换已加载的类行为

在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在为一件事情苦恼,程序出问题了,一时看不出问题出在哪里,于是有了以下对话:

“Debug一下吧。”

“线上机器,没开Debug端口。”

“看日志,看看请求值和返回值分别是什么?”

“那段代码没打印日志。”

“改代码,加日志,重新发布一次。”

“怀疑是线程池的问题,重启会破坏现场。”

长达几十秒的沉默之后:“据说,排查问题的最高境界,就是只通过Review代码来发现问题。”

比几十秒长几十倍的沉默之后:“我轮询了那段代码一十七遍之后,终于得出一个结论。”

“结论是?”

“我还没到达只通过Review代码就能发现问题的至高境界。”

阅读更多

Service Mesh中Envoy的那点事

提到Envoy就不得不提Service Mesh,说到Service Mesh就一定要谈及微服务了,那么我们就先放下Envoy,简单了解下微服务、Service Mesh以及Envoy在Service Mesh中处于一个什么样的角色。

过去几年间,架构领域最火的方向非微服务莫属,那么微服务架构到底为我们带来了什么样的好处呢?下面通过一张图说明架构的演进,如下:

伴随着业务规模的变大,微服务的好处显而易见,例如它本身所具备的可扩展性、易维护性、故障和资源隔离性等诸多特性使得产品的生产研发效率大大提高,同时,基于微服务架构设计,研发人员可以构建出原生对于“云”具备超高友好度的系统,让产品的持续集成与发布变得更为便捷。

阅读更多

Envoy源码分析:Dispatcher

Dispatcher

在Envoy的代码中Dispatcher是随处可见的,可以说在Envoy中有着举足轻重的地位,一个Dispatcher就是一个EventLoop,其承担了任务队列、网络事件处理、定时器、信号处理等核心功能。在Envoy threading model这篇文章所提到的EventLoop(Each worker thread runs a “non-blocking” event loop)指的就是这个Dispatcher对象。这个部分的代码相对较独立,和其他模块耦合也比较少,但重要性却不言而喻。下面是与Dispatcher相关的类图,在接下来会对其中的关键概念进行介绍。

Envoy源码分析之Dispatcher

阅读更多

云原生架构设计原则

云原生(Cloud Native)的概念,由来自Pivotal的MattStine于2013年首次提出,被一直延续使用至今。这个概念是Matt Stine根据其多年的架构和咨询经验总结出来的一个思想集合,并得到了社区的不断完善,内容非常多,包括DevOps、持续交付(Continuous Delivery)、微服务(MicroServices)、敏捷基础设施(Agile Infrastructure)和12要素(TheTwelve-Factor App)等几大主题,不但包括根据业务能力对公司进行文化、组织架构的重组与建设,也包括方法论与原则,还有具体的操作工具。采用基于云原生的技术和管理方法,可以更好地把业务生于“云”或迁移到云平台,从而享受“云”的高效和持续的服务能力。

顾名思义,云原生是面向“云”而设计的应用,因此技术部分依赖于在传统云计算的3层概念(基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)),例如,敏捷的不可变基础设施交付类似于IaaS,用来提供计算网络存储等基础资源,这些资源是可编程且不可变的,直接通过API可以对外提供服务;有些应用通过PaaS服务本来就能组合成不同的业务能力,不一定需要从头开始建设;还有一些软件只需要“云”的资源就能直接运行起来为云用户提供服务,即SaaS能力,用户直接面对的就是原生的应用。

阅读更多

如何应对随机杀死服务的“猴子”

Chaos Monkey:系统中的猴子

只要你有过在生产环境中实际运行过分布式系统的经历,你就应该清楚,各种不可预期的突发事件一定会发生。分布式系统天生包含大量的交互、依赖点,可以出错的地方数不胜数。硬盘故障、网络不通、流量激增压垮某些组件,我们可以一直列举下去。这都是每天要面临的常事儿,处理不好就会导致业务停滞,性能低下,或者是其他各种无法预期的异常行为。

在复杂的分布式系统中,人力并不能够阻止这些故障的发生,我们应该致力于在这些异常行为被触发之前,尽可能多地识别出会导致这些异常的,在系统中脆弱的,易出故障的环节。当我们识别出这些风险,我们就可以有针对性地进行加固,防范,从而避免故障发生时所带来的严重后果。我们能够在不断打造更具弹性(弹性:系统应对故障、从故障中恢复的能力)系统的同时,树立运行高可用分布式系统的信心。

阅读更多

用小内存来处理大规模数据

当你写了一个处理数据的软件,它可能在小样本文件上运行地很好,但一旦加载大量真实数据后,这个软件就会崩溃。

问题在于你没有足够的内存——如果你有 16GB 的 RAM ,你就无法一次载入 100GB 大小的文件。载入这么大的文件时,操作系统在某个时刻就会耗尽内存,不能分配存储单元,你的程序也就会崩溃。

所以,你该怎样防止这类情况发生?你可以启动一个大数据集群——你所需要做的是:

  • 搞到一个计算机集群。
  • 花一周时间搭建这个集群。
  • 大部分情况下,你需要学习一套全新的 API,重写你所有的代码。

这个代价可能很昂贵,会令人沮丧;幸运的是,大部分情况下,我们不必这样做。

你需要一个简单而容易的解决方案:在单机上处理你的数据,最小化环境搭建开销,尽可能利用你正在使用的代码库。实际上,大部分情况你都可以做到这样,只要使用一些方法即可,有时候这些方法被称为“核外计算”(out-of-core computation)。

本文将介绍如下内容:

  • 你究竟为什么需要 RAM。
  • 处理无法放入内存的数据最简单的方法:花些钱。
  • 处理大量数据的三种基本软件方法:压缩、分块、索引。

阅读更多

为什么SRE才代表更好的运维

SRE是什么?

SRE(Site Reliability Engineering)即网站可靠性工程,提及SRE很多人会联想到运维工程师、系统工程师,其实不然,SRE本质上仍然是软件工程师,下面我们从SRE的发展历史展开来进行介绍。

SRE最早在十多年前Google提出并应用,近几年逐步在国内外TOP互联网公司都开始广泛应用。据笔者了解业界SRE落地成功的权威有Google、Netflix等,前者缔造了SRE,并奠定了其权威的地位,而后者将SRE的实践做到了极致,据官方曝露的信息,Netflix仅有的个位数的Core SRE支持了190个国家、数亿用户、数万微服务实例业务规模的运维。

近几年随着DevOps的发展,SRE开始被大家熟知,国内的一线互联网公司如BAT、美团也都逐步从组织架构、招聘上均有体现。以阿里为例,不同的BU均有设置SRE团队,然而在不同的部门,SRE的职责划分却不尽相同,那么SRE究竟在做什么?

SRE的职责

SRE主要负责Google所有核心业务系统的可用性、性能、容量相关的事情,根据《Site Reliability Engineering 》一书提及的内容,笔者做简单汇总,Google SRE的工作主要包括但不限于如下:

  • 基础设施容量规划
  • 生产系统的监控
  • 生产系统的负载均衡
  • 发布与变更工程管理
  • on-call(轮值) 与 Firefighting(紧急故障救火)
  • 与业务团队协作,共同完成疑难问题的处理

阅读更多


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15