Arganzheng's Blog

stay hungry, stay foolish

SLA和QoS在RPC/OpenAPI容器中的作用

其实OpenAPI和RPC本质上是一样的,只是由于OpenAPI是对外开放的,而RPC一般是内部服务调用。两者的考虑点不同,所以在通信协议和序列化方式上有些不同。 作为一个RPC框架或者一个OpenAPI容器,它是连接服务消费者和服务器提供者的桥梁。他其实只是一个请求的转发而已。他的服务质量取决与服务提供者的服务质量。然而因为是一个容器,为了保证消费者的权利,同时也是为了保证其他服务提供者的稳定性和服务质量,必须指定服务规范,避免短板效应和害群之马。这就是为什么要引入SLA的原因。同时,由于服务之间有轻重之分,简单的大锅饭显然不利于资源的最大化利用以及对外提供最佳服务(性能与可靠性)。所以,服务提供者也可以通过QoS协议向容器声明自己的要求和权利,这就是QoS的作...

通讯协议序列化思考

由于我们现在的RPC框架原来的序列化方式太弱了,导致各种序列化问题。所以最近研究了一下相关的序列化方式。主要有: 二进制类的,一般采用TLV编码方式,如Protocol Buffers, Thrift。 文本类的,如JSON, XML。 混合型的,比如Avro,schema是JSON,data是二进制方式的。 序列化一般要么作为RPC传递,或者作为自描述的数据存储,比如数据库。不过后者由于需要存储多条,而且考虑到搜索和更新问题,所以对每条记录做了一定的组织,一般是B树组织结构。 事实上,实现一个简单的通讯协议序列化是非常简单的(通信协议之序列化)。关键在于一些细节问题,需要好好思考: 1. 性能与带宽 二进制协议最大的特点就是节省空间和带宽...

分布式系统常用思想和技术总结

一、分布式系统的难点 分布式系统比起单机系统存在哪些难点呢? 1. 网络因素 由于服务和数据分布在不同的机器上,每次交互都需要跨机器运行,这带来如下几个问题: 1. 网络延迟:性能、超时 同机房的网络IO还是比较块的,但是跨机房,尤其是跨IDC,网络IO就成为不可忽视的性能瓶颈了。并且,延迟不是带宽,带宽可以随便增加,千兆网卡换成万兆,只是成本的问题,但延迟是物理限制,基本不可能降低。 这带来的问题就是系统整体性能的降低,会带来一系列的问题,比如资源的锁住,所以系统调用一般都要设置一个超时时间进行自我保护,但是过度的延迟就会带来系统的RPC调用超时,引发一个令人头疼的问题:分布式系统调用的三态结果:成功、失败、超时。不要小看这个第三态,这几乎是所有分布式...

Config Server和SLA在RPC中的作用

背景 在分布式系统中,经常会遇到这样的业务场景: 查找远程服务的地址 查找资源地址(如mc,redis等) 访问远程服务时,获取超时时间、Load balance策略、灰度策略、HA策略等配置 当系统规模较小时,地址信息和配置信息可以保存在本地的文件系统中,以达到简单高效的目的。但是随着系统的壮大和服务器数量的增加,配置和地址信息的变更可能需要重启大量的服务器,这将会是十分“重量级”的操作。而这就是Config Service所要解决的问题。 Config Service Config Service是集配置服务和命名服务于一身的基础服务。它将地址信息和配置信息集中管理在云端,并且提供实时的变更通知。最常见的使用方是RPC服务。原则上来说,...

一个有意思的Scala函数式编程例子

问题 输入一个Map[String, Any],要求过滤掉这个map中所有key=”version”的元素。 示例输入: val subMap = Map("version" -> "3", "hello" -> "world") val map = Map("version" -> 1, "query" -> "arganzheng", "pageNumber" -> "1", "resultPerPage" -> "10", "data" -> subMap) 非函数式的写法 查看了一下scala的集合操作,是有一个filter的操作,但是这个函数只对当前map的元数据进行过滤,并没有递归处理子map。 ...

网络RPC编码协议学习

由于我们现在的RPC框架原来的序列化方式太弱了,导致各种序列化问题。所以最近研究了一下相关的序列化方式。主要有: 二进制类的,一般采用TLV编码方式,如Protocol Buffers, Thrift。 文本类的,如JSON, XML。 混合型的,比如Avro,schema是JSON,data是二进制方式的。 二进制编码 主要是TLV编码及其变体。 TLV是Tag-Length-Value的简称,其实它原来的名称为Type-Length-Value。顾名思义,就是把每个字段按照Type-Length-Value的顺序依次进行编码。有这三个信息,接收端就能够正确的将这个字段进行解码。Protobuf/thrift/ASN BER都属于这种。 ...

Thrift的序列化版本控制

在现实世界中,唯一的不变就是变化。即使是接口定义也不例外。所以,做好接口版本控制,升级和兼容是非常重要的一个指标。 The system must be able to support reading of old data from log files, as well as requests from out-of-date clients to new servers, and vice versa. 跟PB一样,都是通过Field Identifiers实现的。即,对IDL中定义的字段用一个唯一的数字进行标识。每个序列化字段的标识是由这个field id及其类型声明组合构成的。 Versioning in Thrift is implem...

tips for sublime text

Command Palette 类似于shell终端,提供了sublime text的所有支持命令。可以说是总入口,比如Package Control就是通过Command Palette调用出来的(Press ⌘⇧P to bring up the command palette, begin to type “install”, and select “Package Control: Install Package”. )。快捷键为Command-P(⌘⇧P)。 Package Control 安装完Sublime text之后,先安装一个插件管理器方便插件的安装和卸载。Sublime Package Control。内网安装插件要设置代理:Sublim...

BTrace实战

什么是BTrace 官方文档上有个非常简洁精辟的介绍。 BTrace is a safe, dynamic tracing tool for the Java platform. BTrace can be used to dynamically trace a running Java program (similar to DTrace for OpenSolaris applications and OS). BTrace dynamically instruments the classes of the target application to inject tracing code (“bytecode tracing”). Tracing...

循环引用序列化问题

假如一个对象里面引用了自己,那么序列化的时候如果不做特殊处理就会死循环了。在XStream中是采用reference处理的。反序列化的时候也根据reference来特殊处理。JSON也是类似的,不过貌似支持不是很好。 package me.arganzheng.study.xstream; import org.apache.commons.lang.StringUtils; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver; /** * 循环引用序列化例子 * * @author argan...

×