grpc-go源码解析5-method Posted on 2019-08-14 | 简略分析服务端代码,关键是如何获取调用的服务及方法 概览grpc使用protobuf序列化数据并传输,那么服务端如何知道client调用的是哪个服务的哪个方法呢?我们通过追踪服务端代码观察一下该过程 服务端调用代码路径服务端关键代码如下: 1234567...s := grpc.NewServe ... Read more »
grpc-go源码解析4-balancer Posted on 2019-08-12 | grpc客户端源码分析,重点分析grpc中的负载均衡器balancer 概览12345roundrobinConn, err := grpc.Dial( fmt.Sprintf("%s:///%s", exampleScheme, exampleServiceName), g ... Read more »
grpc-go源码解析3-resolver Posted on 2019-08-09 | grpc客户端源码分析,重点分析grpc中的名字解析器resolver 概览 一个grpc客户端首先通过resolver获取多个IP地址,这些IP地址可能是服务端的地址也可能是一个load balancer的地址,随着地址返回的还有一个service config,其中会指明load bala ... Read more »
grpc-go源码解析2-client Posted on 2019-07-30 | grpc客户端源码分析,重点分析grpc.Dial函数 函数原型分析123func Dial(target string, opts ...DialOption) (*ClientConn, error) { return DialContext(context.Background ... Read more »
grpc-go源码解析1-example Posted on 2019-07-30 | grpc使用protobuf编解码,使用http2传输数据.我们通过一个示例来看下如何编写grpc客户端和服务端代码.注意代码分为两部分,一部分是protobuf生成的stub,一部分是需要用户实际编写的代码.以下分别用protobuf客户端,protobuf服务端以及grpc客户端和grpc服务 ... Read more »
Redis 内存碎片 Posted on 2019-07-22 | 内存碎片举个例子,假设一个Redis实例中共有5GB的数据,然后删除了2GB数据,RSS仍旧可能是5G.也就是说并不是在Redis中将key删除后就会将占用的内存返回给OS.这个特性并不是Redis独有的,因为该特性是由服务端代码使用的内存分配器决定的(libc的malloc,jemalloc,tc ... Read more »
Redis resp3协议解析 Posted on 2019-07-12 | 背景redis客户端和服务端通过resp协议进行交互,现在使用的版本是resp2.那么resp2有哪些缺点呢? 没有足够的语义表述:例如 lrange,smembers,hgetall在resp2中都会返回一个multi bulk reply(参考resp2返回类型的描述),而实际上这三个命令分别 ... Read more »
leveldb源码解析3之compact Posted on 2019-06-28 | compact时机首先看如下代码: 12345bool NeedsCompaction() const { Version* v = current_; return (v->compaction_score_ >= 1) || (v->file_to_compact ... Read more »
leveldb源码解析2之memtable持久化 Posted on 2019-06-27 | memtable持久化时机当我们使用Put命令时,会经过如下调用链:DBImpl::Put->DB::Put->DBImpl::Write->DBImpl::MakeRoomForWrite该函数进行了如下判断: level0的文件数超过了8个,该次写入阻塞1ms 当前memta ... Read more »
leveldb源码解析1之API Posted on 2019-06-26 | Put操作继续看该段代码: 123456789101112leveldb::WriteOptions writeOptions;for (unsigned int i = 0; i < 2; ++i){ ostringstream keyStream; keyStream ... Read more »