微服务架构下,常常需要根据地区、集群、实例、请求等维度,对端到端流量的路由路径做出精确控制。中间件在程序整体开发中扮演重要作用。当存储行为服务崩溃时,可加设消息队列以解耦。消息队列中,流行的包括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)结合了上述三种算法的优点:
- 对短序列插入排序
- 其他输入下,采用快速排序
- 当快排表现不良时,则采用堆排序