说说零拷贝

从一个业务场景开始:从本地磁盘读取一个文件通过socket发送出去。(kafka消费场景)

传统的I/O接口处理流程如下:读文件到应用->应用打包文件到socket->发送

  1. 应用发起系统调用sys_read()(或等价的方法)请求读磁盘文件
  2. 系统切换到内核态,读磁盘数据到内核读缓冲区(DMA方式)
查看更多

redis-缓存数据库双写一致性方案解析

从理论上来说,设置过期时间是保证缓存数据库最终一致性的解决方案。在这种方案下,我们可以对存入缓存的数据设置过期时间,所有写操作以数据库为准,对缓存操作知识尽最大努力即可。也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,后面的请求自然会从数据库中读取新值然后填回缓存。因此,接下来讨论的思路不依赖于给缓存设置过期时间这个方案。

本文讨论三种更新策略:

  • 先更新数据库,再更新缓存
  • 先删除缓存,再更新数据库
查看更多

redis-总结精讲

本文围绕以下几个主题:

1、为什么使用redis
2、使用redis有什么缺点
3、单线程的redis为什么这么快
4、redis的数据类型,以及每种数据类型的使用场景
5、redis的过期策略以及内存淘汰机制
6、redis和数据库双写一致性问题
7、如何应对缓存穿透和缓存雪崩问题
8、如何解决redis的并发竞争问题

1、为什么使用redis

在项目中使用redis,主要是从两个角度去考虑:性能并发。当然redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis。因此,这个问题主要从性能和并发两个角度去答。

1.1 性能

如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应

题外话:忽然想聊一下这个迅速响应的标准。其实根据交互效果的不同,这个响应时间没有固定标准。不过曾经有人这么告诉我:”在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间解决。另外,超过一弹指的耗时操作要有进度提示,并且可以随时中止或取消,这样才能给用户最好的体验。”
那么瞬间、刹那、一弹指具体是多少时间呢?
根据《摩诃僧祗律》记载

查看更多

rocketmq-分布式事务解决方案

1. 分布式事务简介

X/Open Distributed Transaction Processing Reference Model 是X/Open这个组织定义的一套分布式事务的标准,也就是定义了规范和API接口,由各个厂商进行具体的实现。这个标准提出了使用二阶段提交2PC (Two-Phase-Commit)来保证分布式事务的完整性。后来J2EE也遵循了X/OpenDTP规范,设计并实现了java里的分布式事务编程接口规范JTA(Java Transaction API)

分布式事务包括事务管理器(Transaction Manager)和一个或多个支持 XA 协议的资源管理器 ( Resource Manager )。

1.1 分布式事务中的角色

在X/OpenDTP事务模型中,定义了三个角色:

  1. AP:application,应用程序,也就是业务层。哪些操作属于一个事务,就是AP定义的
查看更多

rocketmq-消息的存储和发送

由于分布式消息队列对于可靠性的要求比较高,所以需要保证生产者将消息发送到broker之后,保证消 息是不出现丢失的,因此消息队列就少不了对于可靠性存储的要求。

MQ消息存储选择

从主流的几种MQ消息队列采用的存储方式来看,主要会有三种

  1. 分布式KV存储,比如ActiveMQ中采用的levelDB、Redis, 这种存储方式对于消息读写能力要求不 高的情况下可以使用
查看更多

rocketmq-基本原理分析

阿里巴巴在2012年开源,2017年成为apache顶级项目

核心设计几件了kafka,所以我们在了解rockeetMq时会发现很多和kafka相同的特性。同时,它在某些功能上氪kafka又有较大的差异。

rocketMQ 特性:

  • 支持集群模型,负载均衡、水平扩展
查看更多

docker-引擎安装与基本使用

1、安装docker

第一步:卸载之前的docker

1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

第二步:安装必要的依赖

1
2
3
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

第三步:设置docker仓库

查看更多