常见面试题 前言 1. redis和memcached的区别 redis支持的类型更丰富,有string,hash,list,set,zset等类型,而memcached只有key-value一种模式; redis支持数据的持久化,可以把内存中的数据保存到磁盘,所以在重启之后能够加载原来的数据,而memcached的数据都保存在内存中,如果重启或者挂掉,数据就没了; redis原生就支持集群,memcache 2023-04-06 MySQL #MySQL
Kafka消息积压 一、事故现场 当天风和日丽,正在开(chou)开(mei)心(ku)心(lian)的排查bug,客户突然告警,某个引擎需要下发的数据没有推送,由于刚巧重启过服务,事故日志未保留,本地也未持久化相关日志,导致事故现场未保留,也不知道具体原因。 二、解决方案 由于此引擎作用为从Kafka消费消息,然后通过http或者Kafka的方式推送给下游,导致事故发生时积压了很多数据,因为决定先增加日志并重启服 2023-03-17 #事故排查
超时控制 一、原因 如果没有超时控制,当一个节点故障后,其他节点也会受到影响导致故障,所以单节点不容易被打死,才不会引起其他控制。 不希望不等到断开的实例知道超时,尽量控制返回时间,如果是无响应界面,用户体验是很差的。 服务调用链是串联的,很有可能导致超时叠加,最终导致请求堆积,无法被消费。 网络传递具有不确定性。 客户端和服务端不一致的超时策略导致资源浪费,当上游超时时间较短时,会导致上游超时后下游仍在执 2023-03-08 微服务 #微服务
Zed-web框架 一、简介 在使用过beego、gin、kratos等常用框架后,他们的设计理念和提供的功能有很多共性,为了更好提高自己的一些理解,决定简单的写一个web框架。 二、编写 1. 路由 参考gin框架,我们先写一个engine,将路由和对应的执行方法利用map的方式绑定起来,并且把engine的生成方法收束起来由框架控制。 123456789101112131415161718192021222324 2023-03-08 Zed系列 #Zed系列
隔离 隔离 隔离,本质上是对系统或者资源进行分割,从而实现当系统发生故障时能够限定传播范围和影响范围,即发生故障后只有出问题的服务不可用,保证其他服务仍然可用。 1. 服务隔离 1.1 动静隔离 小到CPU的cacheline,false sharing、数据库mysql表设计中避免bufferpool频繁过期,隔离动静表,大到架构设计中的图片、静态资源等缓存加速。本质上都体现的一样的思路,即加速、缓存 2023-03-07 微服务 #微服务
内存模型 一、场景 如何保证在一个goroutine中看到另一个goroutine修改的变量的值,如果程序中修改数据时,有其他goroutine同时读取,那么必须将读取串行化。 Happen-Before 在一个goroutine中,读和写时按照一定顺序执行的,由于goroutine的重排,他的执行顺序可能是不确定的。 Memory Reordering 为了提高读写效率,编译器会对读写指令进行重新排列,这 2023-03-07 Go #Go
并行编程 并行设计原则 Keep yourself busy or do the work yourself 如果依赖于协程的结果返回,不如直接由自己操作 Leave concurrency to the caller 让并行让调用者去控制 123func ListDirectory(dir string)([]string, error)func ListDirectory(dir string) cha 2023-03-07 Go #Go
error 基础构造 1234// The error built-in interface type is the conventional interface for representing an error condition, with the nil value representing no error.type error interface { Error() string 2023-03-07 Go #Go
net/http 1. http request读取body的时候,只能读一次,如果需要读两次,需要进行一次copy,将原始数据copy到一个新的变量。 GetBody()原则上是可以多次读取,但是在原生的http.Request里面,这是个nil。 r.URL.Query()能获取url中携带的参数 header需要注意go会自动把key首字符改成大写 ParseForm()后的值,存在r.F 2023-03-01 Go #Go
context 一、应用场景 在 Go http 包的 Server 中,每一个请求在都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和 RPC 服务。用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的 token、请求的截止时间。当一个请求被取消或超时时,所有用来处理该请求的gorouti 2023-03-01 Go #Go