17.稳定性答疑课

  1. 项目上遇到不熟悉的组件:pulsar,有什么好的学习路径?
  2. NATS 怎样,我看资料不多。和 kafka相比如何?上次的作业就打算用 NATS 代替 kafka。
  3. 看开源代码,有些语法看不懂有什么好方法吗?
  4. 看完曹大的plan 9指南,看go的汇编还是感觉略痛苦和费解啊,请问有没有其他的参考资料可以参考?
  5. 高并发下怎么做TCP的连接管理?time_wait很多有哪些可能引起的?如何解决?
  6. 服务调用偶发性出现网络 socket closed 的错误,排查了两天,没解决。 使用的是 gRPC 协议, 调用的流程是 service -> nginx 代理 -> ingress -> service -> pod ,求解决思路
  7. 服务网格感觉在中小公司很难应用起来,至今自己接触的公司也没看过几家在用,后期真的能推广还是这玩意只适合大公司?
  8. go不带括号的方法调用是什么情况,第一次看到,类似这种,没看懂。
  9. 面试遇到考体系结构的,譬如问各平台下的无锁算法,之前曹大讲过的CAS的amd64实现是MESI,然后arm64实现是SC/LL,这种考的人多么,需要额外去学习么
  10. Nacos(CP+AP)、Consul(CP)在同一场景下,考虑团队使用语言的话,如何选择呀?
  11. 能不能讲一讲栈的内存管理
  12. 有没有什么系统设计的材料或教材,面试用,抱个佛脚
  13. GC的清扫阶段能不能讲一下
  14. morestack用户栈产生的内存占用,其实还是在Linux的堆区么?
  15. m.mcache和p.mcache用处分别是什么,看1.15之后使用的是p.mcache,m.mcache还有什么用呢
  16. 一个G执行完之后如何切换到G0的呢
  17. G和P、M和P以及M和G的绑定关系在代码中是怎么体现呢?
  18. Go 面试一般考哪些或者说应聘者最起码要掌握哪些知识点?曹大在蚂蚁的组的要求重点是啥,问题回答不上来会直接挂掉么
  19. 面试的时候问到这样一个问题:有一个正在线上运行的项目突然偶发了死锁,问怎么定位到这个死锁。
  20. call 和 jmp 的区别
  21. goroutine栈为何能摆脱Linux栈限制
  22. 以前的答疑链接有统一的地方么 golearn上有
  23. 设计http微服务框架有什么项目可以参考么,go-micro、go-zero这类都不注重http,想集成gin做一些东西,感觉就是开源的堆砌,最基本的设计原则有没有参考和设计
  24. goroutine call函数为什么不会产生新的Linux线程栈,全局的g0为什么占用64K,为什么还不到64M
  25. 下午问的 定期删除 过期键的问题,开一个goroutine去删除map里面的key,是不是用sync.Map好些。。记得是读多写少的情况用sync.Map。。这种情况还需要加锁嘛(写着玩的)
  26. 1.我们线上的服务接口 “经常偶发” 超时(一瞬间),想去排查一下,这个地方该怎么排查呢用 holmes嘛,现在碰到问题大家都甩锅到网络问题了。
  27. 2.做压测的时候这个模拟流量是采用流量复制的方式来做的吗?全链路压测时,如何区分正常流量和压测流量?是对流量进行染色吗?
  28. 3.没有低峰期的业务怎么做压测呢,压测不得在低峰期做么,国内外的业务,半夜国外用
  29. 4.事前提到的这些,都是在开发之前提供解决方案的时候,要明确写在解决方案里的吗?
  30. 5.现在还能在提问区提问么
  31. 6.线上压测可以区分压测流量,但是通常是怎排除线上流量对压测流量值的影响,压会不会对线上服务用户造成影响?
  32. 7.有没有什么监控可以得到请求的ip?容器级别,或者在nginx上获取?Prometheus可以吗?
  33. 8.阿里的动态cdn的大概原理是啥,我们目前的业务总是碰到新疆地区手机移动网络经常无法访问到服务器的问题,想用全栈cdn 试试。
  34. 9.限流是做分布式限流吗,还是服务单机做的? go在分布式限流上有相关组件吗?
  35. 10.自适应限流,通过计算load的话,是怎么反馈到上游服务的? 反馈到上游的话,也是存在时间窗口的吗
  36. 11.重试的话traceID需要保持吗?还是不保持?
  37. 12.服务的执行时间设置为3s,通过ctx控制,这时候可以使用当前服务的请求ctx吗?还是再重新生成一个ctx进行上游服务的调用?是,会超时把
  38. 13.项目中多是高可用,稳定性优先于高性能的吗
  39. 14.当一个set切换到另外一个set, 客户端APP或者PC 如何切换,如何通知到Client,是否要有一个全局调度端,如果这个全局调度端挂了怎么?
  40. 15.异地多活,混沌工程,单元化架构感觉是一线公司大流量会做? 感觉写业务系统的底层码农似乎没考虑过? 个人在这方面怎么成长呢
  41. 16.曹大, 课程能讲下 grpc 么?
  42. 17.刚刚讲的可监控、可回滚、可灰度,对于业务功能也需要吗?

项目上遇到不熟悉的组件:pulsar,有什么好的学习路径?

  • 先写一个生产、消费的 demo,本地跑通
  • 生产消费的过程中,可以通过 zk 里的数据可以观察生产和消费的元数据变化流程,这样就对生产消费要维护哪些“元数据”心里有数了然后需要把这些元数据和 pulsar 文档、材料里那些概念关联起来
  • https://github.com/apache/pulsar-client-go,go 的 client 可以直接改代码来观察学习
  • 《apache pulsar in action》

NATS 怎样,我看资料不多。和 kafka相比如何?上次的作业就打算用 NATS 代替 kafka。

  • 自己 side project 用用可以
  • 尽量还是用业界流行的工具
  • 用的人少的工具,碰到问题比较麻烦

看开源代码,有些语法看不懂有什么好方法吗?

  • 用过这个东西,写一些学习的 demo,side project
  • 提供什么样的功能
  • 按照功能点 debug
  • redis,set,lpush

看完曹大的plan 9指南,看go的汇编还是感觉略痛苦和费解啊,请问有没有其他的参考资料可以参考?

  • 一些命令不上手试一下确实不好理解,我们可以在 github 上找一些 assembly shell,来练习简单的汇编指令,比如 push 和 pop,我最开始也不太理解,后来实验了一下马上就懂了
  • 没碰到过的汇编指令,可以查查 intel x86 汇编里面有没有同名的指令,可以用 dlv disass 找到对应的 intel 汇编指令

高并发下怎么做TCP的连接管理?time_wait很多有哪些可能引起的?如何解决?

  • 说明用的是短连接 -> 长连接
  • tcp 内核参数 tcp_tw_reuse = 1
  • server 端的 timewait 没啥影响,只是占点内存;client 端的 timewait 要占端口,如果并发高,那可能会有 address already in use 之类的报错,这种情况下说明,短连接扛不住,还是换长连接吧;
  • 内核 somaxconn 参数
  • 什么是长连接和短连接:
    • 长连接:就是 conn,你一直使用这条连接做通信,在发生一些错误的时候才需要关闭:write error,protocol state
    • 短连接:发起连接,发一个请求,关闭
    • 比如用 wrk 压测的话,可以通过传一个 http header:Connection: close,就变成了短连接压测
  • 这里可能涉及到 keep-alive:http keep alive,tcp keep alive,这两个不是一个概念,经常有人混淆
  • 长连接的 rpc 框架,一般有一套探活机制:比如你们公司两个服务器之间网线直接断了,没有探活是没法知道的,连接就永远僵死在那里了,read timeout => send heartbeat,如果网线剪断了,那 send heartbeat 的时候会报错,这时候就可以正常回收连接相关的资源了
  • 长连接也有长连接的问题,像 go 的 goroutine per connection 的编程模式,连接数超过 5w,如果内存很小,要考虑内存问题

服务调用偶发性出现网络 socket closed 的错误,排查了两天,没解决。 使用的是 gRPC 协议, 调用的流程是 service -> nginx 代理 -> ingress -> service -> pod ,求解决思路

  • 应用里碰到这种错,一般做个重试就完事了
  • 像 k8 之类需要在连接上维护一些状态,有些可能是 Go 内部的 bug,比如下面这个 issue https://github.com/kubernetes/kubernetes/issues/91131
  • 如果还要深入查原因,需要用 tcpdump 来抓包,保存到线下用 wireshark 来分析了,和监控上的一些网络相关的指标要结合一起分析(这个锅一般要甩给运维或者内核组,他们有一些排查问题的工具,比如 hping 啥的,我也不太了解

服务网格感觉在中小公司很难应用起来,至今自己接触的公司也没看过几家在用,后期真的能推广还是这玩意只适合大公司?

  • 首先你要了解 service mesh 到底解决了什么问题
    • 基础设施升级困难
    • 漏洞修复慢
    • 跨团队撕逼
    • 公司内部零信任网络
  • 如果你是小公司,你在框架组,公司线上服务也就几百个实例
    • 开发一个新功能,全部升级一遍,一周就搞定,这种情况下可能上 mesh 的收益不高
    • 假如你们公司的基础设施比较烂,没有 tracing,service discovery, envoy,mosn 这类的工具会跟着 cncf 里的标准不断进行更新,且自动集成至少好了一套方案;可以把 mesh 当成是一个搞基础设施升级的机会~
    • envoy 的代码是真的复杂,量力而行,之前有不少上了 envoy,出故障代码难读懂又下线的案例(几年前了,现在可能好一点

go不带括号的方法调用是什么情况,第一次看到,类似这种,没看懂。

面试遇到考体系结构的,譬如问各平台下的无锁算法,之前曹大讲过的CAS的amd64实现是MESI,然后arm64实现是SC/LL,这种考的人多么,需要额外去学习么

  • atomic 的 API 其实是比较底层的 API,在业务里用的比较多的,可能也就是做做配置加载的时候:
    • var config atomic.Value
    • config.Store()
    • config.Load
  • 深入的知识对软件开发人员收益一般,感兴趣的话,可以看看:cmu 15-418《parallel computer architecture》,https://www.cs.cmu.edu/~418/schedule.html 这门公开课
  • 计算机体系结构量化分析的第五章:《cache coherence && memory consistency》
  • 《a primer on cache coherence && memory consistency》这本书讲的比较深,量力而行

Nacos(CP+AP)、Consul(CP)在同一场景下,考虑团队使用语言的话,如何选择呀?

  • consul 个人觉得上手比较友好
  • 规模做大了再换也来得及,毕竟 register, unregister 这些东西在企业内的框架里一般都是封装好 interface 的(不会封装的话,去看看 go-micro 是怎么抽象注册中心的)
  • interface 封装好,换注册中心的时候对业务也是透明的,所以不着急

能不能讲一讲栈的内存管理

  • 主要关注这几个关键的函数
    • newstack
    • stackalloc
    • stackfree
    • shrinkstack
  • g0 和 gsignal 的比较简单,是个固定的栈
  • 普通的用户 g,你要知道栈扩容、缩容的时机,然后跟一下代码就行了~不难的

有没有什么系统设计的材料或教材,面试用,抱个佛脚

  • grokking system design
  • ddia,clean architecture

GC的清扫阶段能不能讲一下

morestack用户栈产生的内存占用,其实还是在Linux的堆区么?

  • 是 linux 的堆区

m.mcache和p.mcache用处分别是什么,看1.15之后使用的是p.mcache,m.mcache还有什么用呢

  • 印象中是一个东西

一个G执行完之后如何切换到G0的呢

G和P、M和P以及M和G的绑定关系在代码中是怎么体现呢?

  • g.m.p,代码里一搜就懂~

Go 面试一般考哪些或者说应聘者最起码要掌握哪些知识点?曹大在蚂蚁的组的要求重点是啥,问题回答不上来会直接挂掉么

  • 岗位相关
    • 业务,要求不高,Go,熟悉语法,了解常见问题,剩下的就是相关的八股文,做的业务的领域知识
    • 基础设施,有的人问问 Go 的底层数据结构实现,常见的坑,领域相关,长连接短连接,tw,半连接队列,graceful 的时候各种 fd 怎么处理;
    • 算法,有的公司难有的公司简单,leetcode med 可以应付国内所有公司的算法面试

面试的时候问到这样一个问题:有一个正在线上运行的项目突然偶发了死锁,问怎么定位到这个死锁。

  • 如果有现场给你查,那用 pprof 进网页里去读调用栈,可以找到因为加锁顺序导致的死锁,也可以定位出来递归 rlock 死锁;锁一般最终都是阻塞在 Semacquire 之类的函数上,能看懂 runtime 的栈就知道咋回事
  • 如果是偶发的,且死锁之后会很快地让程序 OOM,那就得用我之前这个工具了:https://github.com/mosn/holmes

call 和 jmp 的区别

  • call = push rip + jmp to target
  • jmp = jmp to target
  • ret = pop rip —> rip

goroutine栈为何能摆脱Linux栈限制

  • 放在 linux heap 上的

以前的答疑链接有统一的地方么 golearn上有

设计http微服务框架有什么项目可以参考么,go-micro、go-zero这类都不注重http,想集成gin做一些东西,感觉就是开源的堆砌,最基本的设计原则有没有参考和设计

  • router: gin, chi
  • orm : gorm,sqlx,xorm
  • swagger,openapi
  • go-redis
  • 业务的抽象方面:ddd, clean architecture,github 上找代码模板
  • 框架的抽象方面:我们课上也讲过,可以参考一下 go-micro 的 interface 设计,不过不用完全抄

goroutine call函数为什么不会产生新的Linux线程栈,全局的g0为什么占用64K,为什么还不到64M

  • 图片
  • newproc -> malg -> 2KB
  • func call -> func prologue, func epilogue,
    • prologue -> check stackguard -> 检查当前栈空间够不够用 -> 不够用 -> jmp func epilogue
    • morestack_noctx -> morestack -> 保存现场 -> newstack
  • g0 主要是执行 runtime 内部的一些调度代码,函数调用比较少,这个全局 g0 是和主线程 m0 一起的,我也不清楚为啥是 64k(orz

下午问的 定期删除 过期键的问题,开一个goroutine去删除map里面的key,是不是用sync.Map好些。。记得是读多写少的情况用sync.Map。。这种情况还需要加锁嘛(写着玩的)

1.我们线上的服务接口 “经常偶发” 超时(一瞬间),想去排查一下,这个地方该怎么排查呢用 holmes嘛,现在碰到问题大家都甩锅到网络问题了。

2.做压测的时候这个模拟流量是采用流量复制的方式来做的吗?全链路压测时,如何区分正常流量和压测流量?是对流量进行染色吗?

  • 有的会用流量回放,有的直接由平台可以mock海量流量。
  • 猜测给流量打标记,比如说http request 里面 header 加个标示,rpc类似,用来区分流量是哪种流量。
  • 模拟了太平洋小岛上的 xx 需求

3.没有低峰期的业务怎么做压测呢,压测不得在低峰期做么,国内外的业务,半夜国外用

  • 白天压国外集群,晚上压国内集群

4.事前提到的这些,都是在开发之前提供解决方案的时候,要明确写在解决方案里的吗?

  • 压测,一般有管稳定性的 qa 跟着,sre 跟
  • 业务负责人需要在系统被压出问题的时候及时跟进解决
  • 补充:我仔细想了想,如果是说高可用相关的,解决方案里还是要有涉及的

5.现在还能在提问区提问么

  • 可以的

6.线上压测可以区分压测流量,但是通常是怎排除线上流量对压测流量值的影响,压会不会对线上服务用户造成影响?

  • 压测选在业务低峰期
  • 有压测大盘
  • 有压测自动中止的机制(核心链路上有服务突然大量报错)
  • 也有需要手动中止的情况

7.有没有什么监控可以得到请求的ip?容器级别,或者在nginx上获取?Prometheus可以吗?

  • 负责LB负载均衡部门会做这种监控的
  • 一般都是访问日志,不清楚 Prometheus 可行不,但是都是收集LB(负载均衡层)的访问日志(access.log),然后解析日志,感觉像 ELK那一套,然后解析日志用 流处理Flink 解析访问数据。
  • x-forwarded-for
  • https://pawelurbanek.com/elk-nginx-logs-setup

8.阿里的动态cdn的大概原理是啥,我们目前的业务总是碰到新疆地区手机移动网络经常无法访问到服务器的问题,想用全栈cdn 试试。

9.限流是做分布式限流吗,还是服务单机做的? go在分布式限流上有相关组件吗?

  • 自适应限流是单机,看你本机的 CPU、mem、avg time
  • 1.有整体的流量上限阈值:apollo 之类的配置系统里
  • 2.服务要自己订阅自己,就知道自己的总的实例数

10.自适应限流,通过计算load的话,是怎么反馈到上游服务的? 反馈到上游的话,也是存在时间窗口的吗

  • 本实例查询本实例的 load,根据 load 的情况拒绝一部分请求
  • 会返回 overload 的错误码,这样上游会减少重试,sre 书里也有讲

11.重试的话traceID需要保持吗?还是不保持?

  • 肯定要保持的

12.服务的执行时间设置为3s,通过ctx控制,这时候可以使用当前服务的请求ctx吗?还是再重新生成一个ctx进行上游服务的调用?是,会超时把

  • 应该要复用吧,deadline 还是要遵守的吧

13.项目中多是高可用,稳定性优先于高性能的吗

  • ha > high perf

14.当一个set切换到另外一个set, 客户端APP或者PC 如何切换,如何通知到Client,是否要有一个全局调度端,如果这个全局调度端挂了怎么?

  • nginx 在淘宝之类公司,有一些逻辑,种 cookie 的时候会给用户返回他所在的 set
  • 数据同步的过程得再调研一下,我也不太清楚
  • 全局调度端如果是说最外层那个 lb,那得看看 gslb 之类的高可用设计了~这个 Google 应该有过分享

15.异地多活,混沌工程,单元化架构感觉是一线公司大流量会做? 感觉写业务系统的底层码农似乎没考虑过? 个人在这方面怎么成长呢

  • 搞稳定性和单元化架构,异地多活,这些架构师都在业务部门
  • 搞异地多活、单元化架构的人,这些就是业务架构师
  • 混沌工程可能 qa 或者 sre 搞吧
  • 公司内做这些的话,业务系统的负责肯定也要做跟进的

16.曹大, 课程能讲下 grpc 么?

  • 暂时木有计划

17.刚刚讲的可监控、可回滚、可灰度,对于业务功能也需要吗?

  • 红线,所有一线研发都必须遵守的,否则出了故障直接 325

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lihuanjie113@gmail.com

×

喜欢就点赞,疼爱就打赏