摘要:
一、共识算法 -- 拜占庭问题 两忠一叛问题: 如上图所示,将军A、B、C约定同时进攻或者撤退,假如将军C叛变了,被中间人截取消息并发送进攻给A、撤退给B,当所有将军消息都收到后结果如下:A:2票进攻1票撤退;B:2票撤退1票进攻;导致最终A独自去攻打敌军,B撤退,最终会任务失败。 口信消息型拜占庭 阅读全文
摘要:
1. 语言层面的锁 乐观锁: 原子操作中的比较并交换简称CAS(Compare And Swap),在sync/atomic包中,这类原子操作由名称以CompareAndSwap为前缀的若干个函数提供 func CompareAndSwapInt32(addr *int32, old, new in 阅读全文
摘要:
一、prometheus基本原理介绍 prometheus是基于metric采样的监控,可以自定义监控指标,如:服务每秒请求数、请求失败数、请求执行时间等,每经过一个时间间隔,数据都会从运行的服务中流出,存储到一个时间序列数据库中,之后可通过PromQL语法查询。 主要特点: 多维数据模型,时间序列 阅读全文
摘要:
ETCD整体机制 etcd 是一个分布式的、可靠的 key-value 存储系统,它适用于存储分布式系统中的关键数据。 etcd 集群中多个节点之间通过Raft算法完成分布式一致性协同,算法会选举出一个主节点作为 leader,由 leader 负责数据的同步与分发。当 leader 出现故障后系统 阅读全文
摘要:
一、前言 grpc中没有像go-micro那样集成可插拔式的etcd库使用,如何使得grpc能够使用服务注册发现及命名解析的功能,因此本文基于etcd实现了Name Resolver。 二、所需的grpc版本及高版本grpc、protobuf与etcd兼容问题 grpc相关库: google.gol 阅读全文
摘要:
一、Opentracing opentracing通过提供平台无关、厂商无关的API,使得开发人员可以方便地实现追踪系统。opentracing提供了用于运营支撑系统和针对特定平台的辅助程序库,被跟踪的服务只需要调用这套接口,就可以被任何实现这套接口的跟踪后台(比如Zipkin, Jaeger等等) 阅读全文
摘要:
golang程序的CPU及内存使用情况性能分析 1.runtime.MemStats查看内存占用情况 //读取当前内存信息的方法 func printMemStats() { //定义一个 runtime.MemStats对象 var ms runtime.MemStats //通过对象的属性 查询 阅读全文
摘要:
一. 创建docker-compose.yml并启动docker compose mkdir mysql_server cd mysql_server sudo vim docker-compose.yml docker-compose.yml version: "3" #版本信息 services 阅读全文
摘要:
golang的GC,1.8通过混合写⼊屏障, 使得STW降到了sub ms。go语言中程序代码执行和垃圾回收是并发执行的。 当前Go GC特征 :三色标记,并发标记和清扫,非分代,非紧缩,混合写屏障。三色标记:1. 将所有对象放在白色集合中2. 从rootset遍历可达对象,将可达对象放在灰色集合中 阅读全文
摘要:
对于微服务的实践,一般都是基于Java和Golang的,博主最近研究了下基于Python的微服务实践,现在通过一个简单的服务来分析Python技术栈的微服务实践 技术栈:Python3 + grpc + Zookeeper 服务API:通过学科获取相应的题型 grpc:由Google公司开源的高性能 阅读全文
摘要:
单机服务的可靠性及可扩展性有限,某台服务宕机可能会影响整个系统的正常使用;分布式服务能够有效地解决这一问题,但同时分布式服务也会带来一些新的问题,如:服务发现(新增或者删除了服务如何确保能让客户端知道),容灾(某些服务出现故障如何让客户端只访问正常的服务);ZooKeeper的提出主要是为了解决分布 阅读全文
摘要:
RabbitMQ中RPC的实现:客户端发送请求消息,服务端回复响应消息,为了接受响应response,客户端需要发送一个回调队列的地址来接受响应,每条消息在发送的时候会带上一个唯一的correlation_id,相应的服务端处理计算后会将结果返回到对应的correlation_id。 RPC调用流程 阅读全文
摘要:
远程过程调用,简称为RPC,是一个计算机通信协议,它允许运行于一台计算机的程序调用另一台计算机的子程序,而无需额外地为这个交互作用编程。 RPC与传统的HTTP对比 优点: 1. 传输效率高(二进制传输) 2. 发起调用的一方无需知道RPC的具体实现,如同调用本地函数般调用 缺点: 1. 通用性不如 阅读全文
摘要:
RabbitMQ是一个消息代理,它接受和转发消息,是一个由 Erlang 语言开发的遵循AMQP协议的开源实现。在RabbitMQ中生产者不会将消息直接发送到队列当中,而是将消息直接发送到交换机(exchange),交换机用来接受生产者发送的消息并将这些消息发送给绑定的队列,即:生产者-->交换机- 阅读全文
摘要:
在Kafka中,当有新消费者加入或者订阅的topic数发生变化时,会触发Rebalance(再均衡:在同一个消费者组当中,分区的所有权从一个消费者转移到另外一个消费者)机制,Rebalance顾名思义就是重新均衡消费者消费。Rebalance的过程如下: 第一步:所有成员都向coordinator发 阅读全文
摘要:
目前国内比较流行的第三方支付主要有支付宝和微信支付,博主最近研究了下如何用Python接入支付宝支付,这里我以Tornado作为web框架,接入支付宝构造支付接口。 使用Tornado异步接入支付宝支付流程: 1. 进入蚂蚁金服开放平台填写开发者信息、应用信息 2. 配置RSA256密钥,生成支付宝 阅读全文
摘要:
在kafka的消费者中,有一个非常关键的机制,那就是offset机制。它使得Kafka在消费的过程中即使挂了或者引发再均衡问题重新分配Partation,当下次重新恢复消费时仍然可以知道从哪里开始消费。它好比看一本书中的书签标记,每次通过书签标记(offset)就能快速找到该从哪里开始看(消费)。 阅读全文
摘要:
Kafka是一种分布式的基于发布/订阅的消息系统,它的高吞吐量、灵活的offset是其它消息系统所没有的。 Kafka发送消息主要有三种方式: 1.发送并忘记 2.同步发送 3.异步发送+回调函数 下面以单节点的方式分别用三种方法发送1w条消息测试: 方式一:发送并忘记(不关心消息是否正常到达,对返 阅读全文
摘要:
谈起Redis的用途,小伙伴们都会说使用它作为缓存,目前很多公司都用Redis作为缓存,但是使用Redis仅仅作为缓存未免太大材小用了。深究Redis的原理后你会发现它有很多用途,在很多场景下能够使用它快速地解决问题。常见的用途有:分布式锁控制并发、结合bloom filter用于推荐去重、Hype 阅读全文
摘要:
Elasticsearch是一个基于Lucene的搜索服务器,其搜索的核心原理是倒排索引,今天谈下在日常项目中使用它遇到的一些问题及优化解决办法。 一. 搜索的深度分页问题 在日常项目中,经常会有分页搜索并支持跳页的需求,类似百度、Google搜索那样,使用ES进行这类需求的搜索时一般采用from/ 阅读全文
摘要:
channel架构图 InterFace Server:负责对协议进行解析,将不同的协议分发到不同的Channel Channel Layer:频道层,可以是一个FIFO队列,通常使用Redis Django中配置Channel: CHANNEL_LAYERS的配置: CHANNEL_LAYERS 阅读全文