Kafka结构、负载均衡 以及 Go语言中的排序算法 | 青训营

69 阅读2分钟

微服务架构下,常常需要根据地区、集群、实例、请求等维度,对端到端流量的路由路径做出精确控制。中间件在程序整体开发中扮演重要作用。当存储行为服务崩溃时,可加设消息队列以解耦。消息队列中,流行的包括kafka、RocketMQ、Pulsar、BMQ。其中BMQ 兼容 kafka协议,存算分离。

从整体的方法论看,DevOps结合软件开发和IT运营,从而得以做到开发和运维间的协作与整合。DevOps强调自动化、持续集成、持续交付和监控等实践。DevOps从增强团队间的沟通和协作入手,使软件开发和运维过程更加敏捷、稳定和可靠。DevOps对于架构设计,提供了非常重要的指引作用。

kafka

  • Topic:逻辑队列,对应一个业务场景
  • Cluster:物理集群,可建多个topic
  • Producer:消息生成端,实现批量发送、数据压缩
  • Broker:顺序写,消息索引;零拷贝
  • Consumer:消息消费端,可以Rebalance
  • Partition:支持消息并发处理,提高单个topic吞吐

集群基础上还有zookeeper,存储集群元数据信息。

为了解决两台负载不均衡问题,可以从IO入手; kafka没有自己的缓存,依赖Page Cache,而Page Cache灵活度不足

稳定性治理四种策略:限流、熔断、过载保护、降级。 流量治理方面,核心收益包括不限于提高微服务容错性、提高容灾性、提高开发效率

负载均衡 服务开发前期,可以使用ngrok低成本的让别人访问自己服务。 负载均衡的实验代码如下:

stream {
  upstream backend {
   hash $remote addr consistent;
   server backend1.example.com:12345 weight=5;
   server 127.0.0.1:12345 max fails=3 fail_timeout=30s;
   server unix:/tmp/backend3;
  }
  upstream dns{
    server 192.168.0.1:53535;
    server dns.example.com:53;
  }
server{
  listen 1234;
  proxy_connect_timeout 1s;
  proxy_timeout 3s;
  proxy_pass backend;
  }
server{
  listen 127.0.0.1:53 udp reuseport;
  proxy_timeout 20s;
  proxy_pass dns.
}
server{
  listen[::1]:5678;
  proxy pass unix:/tmp/stream.socket;
 }

Go语言中的排序算法 插入排序的平均复杂度是O(n^2) 快速排序,不断用pivot分割序列直至序列有序,平均复杂度为O(n log n) 堆排序的平均复杂度为O(n log n)

PDQ(pattern defeating quicksort)结合了上述三种算法的优点:

  • 对短序列插入排序
  • 其他输入下,采用快速排序
  • 当快排表现不良时,则采用堆排序