Kafka 简介
Kafka 是一个基于分布式的消息发布-订阅系统,它被设计成快速、可扩展的、持久的。与其他消息发布-订阅系统类似,Kafka 在主题当中保存消息的信息。生产者向主题写入数据,消费者从主题读取数据。由于 Kafka 的特性是支持分布式,同时也是基于分布式的,所以主题也是可以在多个节点上被分区和覆盖的。
信息是一个字节数组,程序员可以在这些字节数组中存储任何对象,支持的数据格式包括 String、JSON、Avro。Kafka 通过给每一个消息绑定一个键值的方式来保证生产者可以把所有的消息发送到指定位置。属于某一个消费者群组的消费者订阅了一个主题,通过该订阅消费者可以跨节点地接收
题目
合并两个有序链表,合并之后仍是有序的。
分析
这个题目很简单,类似于合并排序的合并过程。
实现
节点定义
type ListNode struct {
Val int
Next *ListNode
}
单元测试
var mergeOrderListList = [][][]int{
{
{1, 2, 3, 4},
{7,8,9},
{1, 2, 3, 4, 7, 8, 9},
},{
{1, 2, 3, 4},
{3,8},
{1, 2, 3, 3, 4, 8
题目
输入一个单链表链表的头结点,从尾到头打印每个节点的值。
题目很简单但是实现方法却可以有很多种,也能考察人的不同方面的知识。这里实现使用 go 语言。
实现
节点定义
首先说明这里不能使用各语言内置的链表,比如 java 的 LinkedList。这里要求的单链表只能有两个属性不能有其他的属性和方法。
go 语言定义如下
type ListNode struct {
Val int
Next *ListNode
}
堆栈 or 数组
看到这个题目最先想到的就是用堆栈或数组来做,方法就是遍历所有节点放入到数组或堆栈然后再遍历打印。数组就比较简单了,这里写下堆栈的实现。
首先
什么是负载均衡
负载均衡就是用多台服务器对外提供单一服务,通常用于提高网站、应用、数据库或其他服务的性能和可用性,负载均衡是高可用网络架构的关键组件。
没有负载均衡的架构
有负载均衡的架构
为什么要负载均衡
配置再强的服务器都有服务上限,当单台的服务器无法支持所有用户请求的时候就扩充机器到到几台、几十台甚至更多来提供服务,这个时候需要我们合理的把用户请求分发到各个服务器,这就是负载均衡。
负载均衡要理解最重要的一点,我这里用了“合理的分发”而不是平均分发,因为负载均衡并不是简简单单的均分流量,我们需要考虑到不同的服务器硬件配置、网络情况来合理的分配分配流量以达到各个服务器均不超载、合理利用
什么是全链路压测
使用真实生产业务场景、在真实的生产系统环境下根据历史用户访问记录构造海量用户请求对整个业务链进行压力测试并生成报告,根据报告持续调优的过程。
为什么要全链路压测
我们针对单机器单系统的压测虽然可以掌握单个机器或服务的服务能力但是并不能依此来推测整个系统的服务能力,因为任何一个具体的业务系统都可能在系统容量、业务代码性能、物理机器、网络、中间件和各个系统之间调用或具体的业务流程中等等任何一点上存在瓶颈进而导致真个业务系统的服务能力下降,而这些众多的点我们没办法去确定具体那个点会成为瓶颈,我们只能通过全链路压测来测试服务能力找到瓶颈,因为我们要服务于用户而全链路压测的流量正是 m
下面有两个函数,猜一下哪一个执行的快
func nestFor1() {
a := 0
for i := 0; i < 10000000; i++ {
for j := 0; j < 2; j++ {
a = a + i
a = a + j
}
}
}
func nestFor2() {
a := 0
for i := 0; i < 2; i++ {
for j := 0; j < 10000000; j++ {
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
介绍
意图:提供一个创建一系列相关或则相互依赖对象的接口,而无需指定他们依赖的类。
解决问题:主要解决接口选择的问题
优点:调用方面向接口编程,不用关心具体实现
缺点:扩展新的产品复杂,新增一个新产品需要修改工厂接口和所有工厂类
可应用场景
系统主题:比如一个游戏主题分为男生主题、女生主题
实现
以系统主题为例
结构
代码
游戏颜色
// 颜色接口
type Color interface {
简单工厂模式(Sample Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
介绍
意图:提供一个创建对象的工厂,工厂类函数会根据不同的参数创建实现了同一接口的不同产品类。
解决问题:主要解决接口选择的问题
优点
如果要创建一个产品对象只要知道其名字就可以了,不需要关心具体实现
可扩展,只需要实现一个产品类就可以了
缺点
不同的实现都需要实现一个具体的类,提升系统复杂性
新增产品类的时候需要修改创建对象的工厂
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与
redis 内部链表的实现比较简单,包括 3 个结构体:
src/adlist.h
typedef struct listNode {
struct listNode *prev; // 前一个节点指针
struct listNode * next; // 后一个节点指针
void *value; // 节点值
} listNode;
typedef struct listIter {
listNode *next; // 下一个节点
int direction; // 遍历的方向(从头到尾或反向)
} listIter;
typedef struct list {