熊喵君的博客

Thinking will not overcome fear but action will.

关于 Kafka 应用开发知识点的整理(一)

在项目中使用 Python 的 kafka 进行开发

0x00 前言 项目中使用 Kafka 作为消息队列,本篇文章就个人使用 Kafka 的一些经验做一些总结。大概从下面几个方面: Kafka 的基础知识总结 Kakfa 的生产者分区选择 Kafka 的消费者组机制 Kafka 的 offset 机制? Kafka 的消费延迟问题如何监控和优化? 关于 Kafka 应用的场景 0x01 Kafka 的基本概念...

Kratos 源码分析:超时(Timeout)传递

Context 的用法:Warden/Database 中的超时传递实现分析

0x00 前言 本篇文章,了解下 Kratos Warden 框架中的超时传递机制。 在微服务中,超时和熔断、重试、Backoff 策略都是有关联的。在实际项目中,每一个 RPC 调用都应该有超时退出的能力,这是比较合理的 API 设计。在 Context Deadlines and How to Set Them 中总结了超时的要点: Return an error. Thi...

Kratos 源码分析:Warden 中的 gRPC validator

分析 Kratos 的 gRPC 中的字段验证器

0x00 前言 validator 的意义是什么,简言之,在协议字段定义规则,使得开发者在代码中简化对字段的验证逻辑。 0x01 使用 validator 简单的来说,开启 gRPC 中的协议字段校验需要如下两步: proto 协议中按照指定 validator 包的规则定义字段的校验规则 在 gRPC 的 server 端、client 端中开启 validato...

Kratos 源码分析:Naming 解析(上)

分析 Naming 的多消费者订阅 - Watcher 模式

0x00 前言    分析下 Kratos 框架中的服务注册与发现的代码。准备分为两篇文章,一篇介绍 Naming 的公共接口及基于 Etcd 的 naming 机制实现,另一篇文章介绍 Warden 库是如何使用 Naming 的接口来完成服务注册与发现机制。总体而言,Kratos 的 Naming 逻辑分为如下几块: 公共的 Naming 逻辑与接口封装 ...

Kratos 源码分析:Kratos 中的 Metadata 元数据

一种全局变量的存储方式:Metadata

0x00 前言 看看下面这个例子,将 map[string]interface{} 定义成一个类型,这样直接 newmap:=MD{} 生成的对象就是一个 map(虽然这种语法看起来很奇怪)。理解此用法是分析 Metadata 的基础。 type mdKey struct{} type MD map[string]interface{} func main(){ f...

Kratos 源码分析:Lazy Load Container

分析 Kratos 的懒对象容器及应用场景

0x00 前言    所谓懒加载(Lazy)就是延时加载,延迟加载。至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少并发量及系统资源的消耗,我们让数据在需要的时候才进行加载。这就是懒加载。 在数据、策略等需要 “分组(组中以 Name 区分)” 的情况下,非常适合使用该方式实现存储(取),这里存储的值以 interface{} 表示,可...

分布式锁:使用 Redis 实现

Redis 应用开发:分布式锁构建 && Redlock 实现分析

0x00 前言 在应用环境中,不同的进程需要以互斥的方式使用共享资源时,就必须用到分布式锁。前文中,分析了如何 使用 Etcd 来构建分布式锁。本文,来聊聊如何使用 Redis 构造(可靠 && 高可用)分布式锁。一个高可用的分布式锁 至少需要满足几个条件 : 互斥:在任意时间内,只有一个客户端能够获得一把锁,具有排它性 避免死锁:即使客户端宕机或者从集群中...

Kubernetes 应用改造(三):负载均衡

Kubernetes 中的负载均衡总结

0x00 前言    在前文中,曾经讨论过 “Kubernetes 负载均衡失效” 的问题。即 Kubernetes 的默认负载平衡通常不能与 gRPC 一起使用,在不使用 LoadBalance service 的情况下,因为 HTTP/2 链接复用特性,导致客户端的所有请求都发往同一个 Pod,导致负载不均衡。具体原因可见此文:gRPC Load Balancing on Kube...

gRPC 微服务构建之链路追踪(OpenTracing)

在 gRPC 服务中应用 OpenTracing:使用 Zipkin 和 Jaeger 进行路追踪

0x00 前言 前一篇文章 微服务基础之 链路追踪(OpenTracing),介绍了 OpenTracing 的理论,本文基于 gRPC 与 Zipkin && Jaeger 来实现 Tracing 的应用。 0x01 回顾 OpenTracing 数据模型 一个 Tracer 包含了若干个 Span,Span 是追踪链路中的基本组成元素,一个 Span 表示一...

基于 Golang 实现的定时器分析与实现(二):最小堆 && 时间轮

Timer and Ticker: events in the future

0x00 前言 定时器(Timer)常用于解决 多长时间后触发处理某些事件 的问题。在项目中,通常遇到下面两类问题都可以使用定时器来解决: 延迟消息、事件处理,如订单默认 N 时间跨度后自动评价等 长连接心跳管理,如在 IM 服务器实现中,当客户端与服务端 N 时间跨度内没有 Heartbeat 的话,需要断开此无效连接 各种需要定时调度的实现 0x01 原...