分布式消息投递架构设计
分布式消息投递架构设计。
ConcurrentHashMap 的绝妙设计
HashMapHashMap 用作键值对存储,时间复杂度接近O(1)。
底层数据结构底层数据结构由“数组+链表组成”,数组是HashMap的主体,链表是为了解决哈希冲突(拉链法)而存在的。链表过长会严重影响HashMap的性能,红黑树搜索时间复杂度是O(logn),链表是O(n),JDK1.8之后引红黑树。当达到一定条件,链表和红黑树会进行转换:
当链表长度超过8时,且数组长度超过64会转为红黑树
若数组长度小于64,会先进行数组扩容,而不是转换成红黑树
红黑树增减元素需要进行左旋右旋,变色,这些操作来保持平衡,提高查找效率同时也会增加修改时间,链表元素未到阀值时使用链表。
寻址(key -> 数组下标)HashMap 底层数据结构为数组,如何将key映射到对应数组下标存储位置?最直接的方法,使用key的hashcode值,对数组长度取余,得到数组下标。
在 HashMap 中:
key的hash值算法为h ^ (h >>> 16),h为key的hashCode()值,通过异或一下当数组长度较小时让hash高位也参与运算,让元素更好的散列
将对数组长 ...
分布式状态服务架构
分布式状态服务架构设计
状态服务定义
hash取模数据分片
分段hash
一致性hash
redis hash 槽
一致性 hash 应用
当设计分布式状态服务,需要请求落在持有数据的正确的状态服务节点(粘性负载均衡),所以不能像无状态服务一样随意扩缩容,需要考虑到数据分片和负载均衡策略。
hash 取模数据分片
如图当状态服务节点数量为3个,使用hash取模算法hash(key) % 3对客户端唯一key进行负载均衡,确保每次来自同一客户端的请求路由到同一个状态服务数据节点。
哈希取模分片的核心问题,对扩容不友好,扩容的时候数据迁移规模太大。
比如把节点从3个扩展到4个,分片算法调整为hash(key) % 4,之前存储的大量数据需要重新计算存储节点并迁移,对所有数据重新进行分布。
若一定要采用哈希取模分片,建议采用多倍扩容的办法,如原先的3个节点扩容到6个节点,只需要迁移50%的数据,减少数据迁移量。
数据固定分片如果分片键均衡增长,也可以采用固定数据分片策略。
如图,每个节点负责一个号段的请求,这里为1-300w, 300w-600w, 600w-1000w,当号段超过 ...
用Java做个编译器:语法解析树实现
语法解析一个非常重要的功能就是构建一个树形数据结构,语法解析树。
如图,公式A + B * C解析结果,将公式解析成最小的操作符、操作数,本文以二元操作符加减乘除为例。
由上图推断语法树节点的数据结构:
123456789101112public static class Exp { /** 1.常量值 2.操作符 3.变量值 4.临时存储操作符(加减乘除) */ int type; /** type=1常量值 */ double value; /** type=3 变量名 */ String varName; // type=2 操作符 加减乘除 char opt; // 操作值表达式对象 (常量, 指标值变量, 表达式) Exp[] values;}
解析 5 - ((A + B) * 2 / C) 后的解析树如下图
完整代码实现 Gitee
核心 Java 代码实现:
12345678910111213141516171819202122232425262728293031323334353 ...
Golang GRPC泛化调用
Google远程过程调用(Google Remote Procedure Call,gRPC)是基于 HTTP 2.0传输层协议和 protobuf 序列化协议进行开发承载的高性能开源RPC软件框架。
Grpc 为了实现跨语言特性,通过中间语言 IDL 进行了服务和数据类型的定义,写在 .proto 文件中。由 proto 代码生成工具根据 idl 文件生成各目标语言的 grpc 服务端和客户端代码。
正常调用 grpc 服务必须使用生成出的客户端代码进行调用。
当前业务需要使用网关对 grpc 请求进行代理,统一处理 grpc 客户端请求流量,若每次 grpc 服务新增或修改后,都需重新引入客户端调用代码重启网关,会异常麻烦加大开发运维成本。
这里使用 grpc 泛化调用解决该问题,只提供服务名、方法名和请求参数数据(json或protobuf格式),即可调用 grpc 服务。
完整代码示例:https://gitee.com/tangmingyou/grpc-generic
泛化调用应用场景服务网关 gateway客户端通常使用 http 和 websocket 请求进行访问,在网 ...
hexo+butterfly博客搭建
Hexo静态网页博客框架(基于NodeJS)搭建。
参照官方文档构建1、npm 全局安装 hexo-cli
1npm install hexo-cli -g
2、用hexo-cli脚手架生成博客项目
123hexo init my-blogcd my-blognpm install
3、生成后的目录结构如下
.├── _config.yml #网站主配置文件├── package.json├── scaffolds # 模版文件夹├── source # 存放用户资源(文章、图片)| ├── _drafts| └── _posts└── themes # 主题文件夹
4、本地运行,在 my-blog 目录执行 hexo server,出现如下信息后,在浏览打开 http://localhost:4000/ 即可看到hexo搭建效果。
hider1234567891011121314$ hexo serverINFO Validating configINFO =================================================== ...