0%

前面一篇文章多次讲到SPI机制,本篇文章主要介绍下sentinel中使用到的SPI。如果对SPI不太懂,可以参考这篇文章

在sentinel-core模块的resources资源目录下,有一个 META-INF/services 目录,该目录下定义了sentinel的SPI扩展点,目前有以下三个,同时实现了自定义的SPI加载器SpiLoader,下面的扩展点都是使用这个加载器进行加载。

  1. com.alibaba.csp.sentinel.init.InitFunc:用于配置InitFunc接口的实现类
  2. com.alibaba.csp.sentinel.slotchain.SlotChainBuilder文件用于配置 SlotChainBuilder 接口的实现类
  3. com.alibaba.csp.sentinel.slotchain.ProcessorSlot:用于配置使用到的ProcessorSlot
阅读全文 »

Sentinel是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。

本文从一个简单的例子介绍如何使用sentinel,然后对链路进行简单的介绍,为后面的原理分析做个铺垫。

1
2
3
4
5
6
7
8
9
10
11
12
Entry entry = null;
try {
entry = SphU.entry("demo1");//(1)
// 被保护的业务逻辑
// do something...
} catch (BlockException ex) {
// 资源访问阻止后的处理
} finally {
if (entry != null) {
entry.exit();//(3)
}
}

这是一个很普通的例子,不过已经足以说明sentinel的流程,主要做了以下三件事

  1. 定义资源:资源是Sentinel的关键概念。它可以是Java应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
  2. 当资源访问被阻止后,进行处理
  3. 退出限流 entry.exit()
阅读全文 »

翻译自https://people.apache.org/~fhanik/kiss.html

KISS代表什么?

KISS是Keep It Stupid Simple或Keep It Simple,Stupid的缩写

KISS是什么意思?

这个原则一直是关键,并且在我多年的软件工程中取得了巨大的成功。当今软件工程师和开发人员之间的一个普遍问题是他们倾向于将问题复杂化。

通常,当开发人员遇到问题时,他们会将问题分解成他们认为自己理解的更小的部分,然后尝试用代码实现。我会说10个开发人员中有8个或9个犯了错误,即他们没有将问题分解为足够小或足够容易理解的部分。这导致即使是最简单的问题也会用非常复杂的实现,另一个副作用是面条式代码,我们认为只有BASIC会用它的goto语句来做的事情,但在Java中这会导致类有500-1000行代码,每个方法有几百行。

这种代码混乱是开发人员在输入代码时意识到其原始解决方案存在异常情况的结果。如果开发人员进一步分解问题,这些异常情况就会得到解决。

阅读全文 »

死锁的发生必须具备以下四个必要条件

  1. 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
  2. 请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
  3. 不可剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
  4. 环路/循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
阅读全文 »

本文还未整理完成,目前主要整理的是mysql中锁的种类,以及基本的使用方式。

一致性读

事务利用MVCC进行操作称为一致性读(Consistent Rcad)。或者一致性无锁读(有的资料也称之为快照读)。所有普通的SELECT语句在READ COMMITED、
REPEARABLE READ隔离级别下都算是一致性读,一致性读并不会对表中 的任何记录进行加锁操作 其他事务可以自由地对表中的记录进行改动。

共享锁和独占锁

  • 共享锁(Shared Lock)简称S锁.在事务要读取一条记录时 需要先获取该记录的锁
  • 独占锁(Exclusive Lock)也常称为排他锁,简称X锁。在事务要改动一条记录时需要先获取该记录 锁。

锁的兼容情况

锁定读的语句

读取记录添加S锁

1
select ... LOCK IN SHARE MODE

读取添加X锁

1
SELECT ... FRO UPDATE
阅读全文 »

InnoDB是mysql默认的存储引擎也是使用最多的存储引擎,能够满足大多数的业务需求,其中高并发的优点就是通过mvcc实现的。这篇文章就来介绍下mvcc是如何支持并发的。

MVCC全称Multi-Version Concurrency Control,MVCC是一种通过增加版本冗余数据来实现并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

mysql中的InnoDB中实现了MVCC主要是为了提高数据库的并发性能,在无锁的情况下也能处理读写并发,大大提高数据库的并发度。

首先我们有一张表,业务字段如下

1
2
3
4
5
6
7
8
-- id只是一个普通字段,并不是主键
mysql> select * from ajisun;
+------+--------+--------+
| id | name | city |
+------+--------+--------+
| 100 | ajisun | 上海 |
+------+--------+--------+
1 row in set (0.00 sec)
阅读全文 »

本篇文章主要介绍redis中的Pipeline和事务相关的内容。

阅读全文 »

前面介绍数据持久化、主从复制、故障自动恢复这些功能,提升单台redis服务器的可靠性,但是在qps比较高的情况下,单台服务器的性能难以抗住这些流量,所以需要对redis进行集群部署。

简单来说实现方式就是,多个主从节点构成一个集群,每个节点存储一部分数据,这样写请求也可以分散到多个主节点上,解决写压力大的问题。同时,集群化可以在节点容量不足和性能不够时,动态增加新的节点,对进群进行扩容,提升性能。

当然,集群化也意味着Redis部署架构更复杂,管理和维护起来成本也更高。而且在使用过程中,也会遇到很多问题,这也衍生出了不同的集群化解决方案,它们的侧重点各不相同。

这篇文章我们先来整体介绍一下Redis集群化比较流行的几个解决方案,先对它们有整体的认识,最后在详细介绍下redis官方实现的集群方案。

阅读全文 »