ArchManual
2021-10-27 10:17:52 0 举报
AI智能生成
为你推荐
查看更多
抱歉,暂无相关内容
分布式系统技术栈
作者其他创作
大纲/内容
配置中心
Apollo
Spring Config + Git + MQ
disconf
Zookeeper
Diamond
消息队列
Kafka
RabbitMQ/RocketMQ/ActiveMQ
MTTQ
物联网
DevOps
Gitlab CI / CD
Jenkins
部署容器
Docker + K8S
docker跨主机组网
原生
overlay
macvlan
第三方
Flannel
OpenSwitch
weave
calico
Aliyun ECS
监控
服务器&进程监控
OpenFalcon
Zabbix + Grafana
调用链
Pinpoint / Skywalking
CAT
SpringCloud Sleuth + Zipkin
业务监控
监控业务各种指标(自研)
Falcon/CAT metrics上报
日志
中小日志
ELK
FileBeats 采集
Kafka 日志队列
Logstack 计算
ElasticSearch 存储
Kibana 展示
Flume + Hadoop系
用户行为监控
用户在前端上的各种操作(自研)
降级、熔断
Hystrix
Ali Sentinel
弹性伸缩
K8S + Docker
Aliyun 弹性计算
大数据
HDFS
Hadoop 文件系统
HBase
BigTable
Hadoop MapReduce
计算框架
Spark
计算分析框架 比MR快
Hive
基于Hadoop的数仓工具,提供类SQL进行数据分析
服务治理
自研
服务调用鉴权
指令下发
任务调度
xxl-job
Elastic-JOB
一致性算法
强一致性
Paxos
难实现,目前产品很少采用
Raft
优化Paxos算法,解决两个问题
选举
日志(数据)复制
特点
节点不对等
etcd 分布式键值对系统
ZAB
同Raft
弱一致性
Gossip
Redis Cluster
节点对等
最终一致性
负责均衡
HttpDNS
DNS
F5(硬件)
LVS(4层)
Nginx(7层)
HAProxy
一些架构
MQ的高可用
MQ集群
集群化部署 + 数据多副本冗余(3以上)
降级
MQ高可用降级,当MQ不可用时,降级到写入KV系统,后续进行补发
幂等设计
分布式锁 + 业务重复判断
高并发下分布式锁优化
内存双缓存 + 分段加锁
集中式缓存中的热点KEY问题
发现热点KEY
流式计算发现热点key
通过ZK,通知相关服务
服务读取热点KEY数据到本地缓存
热点过后,或者KEY有更改,通过ZK同事,本地缓存删除或者过期
熔断保护
根据集群的负载能力估算出每个服务实例的最大请求数
超过这个最大请求数,则进行熔断,给客户端发返回空白
MQ可靠消息投递
RabbitMQ自身提供机制
消费者
手动ack
每个消息有一个delivery tag,消息的唯一标识
prefetch count 建议设为100-300
生产者
confirm机制
MQ把消息持久化到磁盘后,回传一个ack消息给生产者
MQ持久化消息到磁盘前,出现问题,回传一个nack给生产者,生产者重发
生产者如果很久么有收到ack或者nack消息,则重新发送消息
投递消息的高延迟性
生产者把消息存在KV中,收到ack之后,把消息删除
系统自身提供最终一致性
可靠消费服务:本地消息表,记录消息状态(2次写库)
插入消息表,状态:待发送
生产者发送消息,更改消息表,状态为已发送
消费者收到消息后,完成本地业务逻辑,回传消息
生产者收到回传消息后,更新消息表,为已完成
跑批进行消费重发
延迟重发机制(1次写库,有丢失)
生产者发送消息
生产者收到回传消息后,消息表中插入数据
延迟重发的消息到达后,判断消息表是否有数据,有则丢弃该消息,否则执行业务逻辑
经验值
数据库配置和并发请求数
16核32G
QPS最好控制在 2000
线程数设置
(每秒并发请求数/一个线程每秒可以处理的任务数) / 0.6(冗余量)
4C8G 建议设置线程数小于100,50左右
Redis单机并发QPS
上万到几万
线上配置的内存最好不要超过10G
Eureka注册中心
4C8G 每秒500-1000请求
服务器
4C8G的服务器,可以承受每秒500~1000的并发请求
4C8G的服务器,线程数设置为50-100,每个任务处理时间在100MS
分布式系统
业界微服务技术栈
SpringCloud
SpringCloud Alibaba
服务调用
RPC
Dubbo/DubboX
HTTP
RestTemplate
OpenFeign
服务容器
Tomcat / Netty / Jetty
注册发现
TCP
Eureka + Ribbon
Long Polling
Nacos
Consul
全局控制
分布式ID
Snowflake(雪花算法)
Redis 自增ID
美团 Leaf
分布式锁
Redis
etcd
分布式事务
数据库
XA
代理层
ShardingSpere
MyCat
框架
Spring JTA
服务
同步调用
TCC(Try/Confirm/Cancel)
业务系统系统Try(预留资源)、Confirm(根据预留资源执行业务逻辑)、Cancel(释放预留资源)
byteTCC/tcc-transaction/easy-transaction/Hmily
Saga
单独事务补充服务(全局事务表 + 子事务补偿表)
Ali Seata
异步调用
MQ支持可靠消息(RocketMQ)
半消息 + 回查接口
可靠消息服务+MQ
上游 - > 可靠消费服务,消息状态更新为 待确认
异常
不进行下面的操作
上游 执行 本地数据库 操作
成功
上游 - > 可靠消费服务,发送MQ,状态已发送
定时查询待确认的消息,回查上游服务的状态,如果本地数据库操作成功 重新发送MQ
失败
上游 - > 可靠消费服务,删除本地消息
定时查询待确认的消息,回查上游服务的状态,如果本地数据库操作删除MQ
下游 收到消息,操作本地数据库
下游-> 可靠消费服务,状态更新为 已完成
定时查询已发送的新消息,进行重发
下游 重试,多次后报警人工干预
本地消息表 + MQ
A服务在一个事务中 插入业务逻辑表+本地消息表
A服务消息到MQ
B服务收到消息后,插入本地消息表 + 执行业务逻辑
B通知A更新本地消息表状态
ZK
MQ
网关
限流、鉴权
Nginx + Lua
KONG(基于OpenResty)
Zuul
Ali Sentinel(限流)
存储
分布式文件系统
Ali OSS
Ceph
RDMS
MySQL
分库分表
ShardingSphere(Sharding-JDBC)
方案
取模
热点分散
取整
冷热分离
行数据<100Byte 5000W/表,行数据>100Byte 1000W/表
高可用
MHA
数据同步
阿里云DTS
binlog
binlog消费订阅canal + otter
数据可视化
开源
superset
Redash
收费
tableau
NoSQL
文档数据库
MongoDB
KV
Redis(CA模型)
持久化
rdb
异步 + copy on write
aof
集群
Codis
etcd(CP模型)
NewSQL
TiDB
时序
InfluxDB
图数据库
Neo4J
搜索
ElasticeSearch
仓库
代码仓库
gitlab
maven仓库
nexus
docker镜像仓库
docker registry
人工智能
TensorFlow
流计算
Spark Streaming
Apache Storm
Flink
延迟任务
redis zset
rabbitmq 死信机制
Java.util.concurrent包下DelayQueue
时间轮
分布式系统协调
协调任务
集群管理
探测集群中机器加入、删除、存活、选主、查询、竞争(锁)、订阅通知、元数据管理
主从切换后IP变化
VIP
keepalived
Zookeeper、etcd
集中式
通过ZK管理元数据
Apache storm
分散
gossip 协议
redis cluster
收藏
0 条评论
回复 删除
下一页