好多 kafka 难题啊,看看其中的化解之道
前面已经分享过几篇面试了,这是一篇关于更加面向项目和技术的面经详解,第一次遇见问那么多 kafka 的问题,看看这个粉丝是怎么回答的。
先来看看 职位描述:
岗位职责:
负责基于 Go 的后端服务的设计、开发和维护;
参与系统架构设计,确保系统的高可用性、高性能和可扩展性;
编写高质量、可维护的代码,并进行代码评审;
解决复杂的技术问题,优化系统性能;
与跨职能团队合作,确保项目按时交付;
编写技术文档和开发规范,提升团队整体开发效率;
参与新技术的研究和引入,推动技术创新。
岗位要求:
计算机科学或相关专业本科及以上学历,思维逻辑清晰;
5 年以上软件开发经验,至少 3 年 Go 语言开发经验;
熟悉 Go 语言的标准库和常用框架,了解 Go 语言的内存管理和并发模型;
具备微服务架构设计和开发经验,熟悉 gRPC、Protobuf 等技术;
熟悉常见的数据库(如 MySQL、PostgreSQL)和缓存技术(如 Redis);
有良好的代码风格和编写高质量单元测试的习惯;
熟悉 Docker、Kubernetes 等容器技术,具备一定的 DevOps 经验;
具备较强的分析和解决问题的能力,良好的沟通和团队协作能力;
有开源项目贡献者或个人技术博客者优先。
加分项:
有 Rust 开发经验,熟悉其他编程语言(如 Python、C++等);
有金融行业交易系统开发经验,如行情报价、交易、风控等。
面试流程
来看看面试的全过程:
自我介绍
说一下项目的业务,怎么做的,难点在哪,如何解决?
消息队列:数据倾斜问题,数据不丢,重复消费
redis:使用 hash 以及 Pipline,bigkey 拆解
数据库:性能优化,分库分表
数据库优化设置 lock_timeout 是哪个锁的超时
数据库优化设置中的 lock_timeout 主要是针对行锁的超时设置。当一个事务在等待获取行锁时,如果超过了 lock_timeout 设置的时间,就会抛出超时错误,避免事务长时间等待而导致系统性能下降。
kafka 集群规模
我们的 Kafka 集群规模为 5 台服务器,能够支持 50 万的并发量。通过合理的配置和优化,我们可以进一步提高 Kafka 集群的性能和并发能力。
kafka 为什么支持高并发
Kafka 支持高并发主要有以下几个原因:
分区:Kafka 将数据分成多个分区,每个分区可以在不同的服务器上进行存储和处理,从而实现了水平扩展,提高了系统的并发能力。
零拷贝:Kafka 采用了零拷贝技术,减少了数据在内存中的复制次数,提高了数据的传输效率。
网络压缩:Kafka 支持网络压缩,可以减少网络传输的数据量,提高系统的性能和并发能力。
说一下什么是零拷贝
零拷贝是一种技术,主要通过减少数据在内存中的复制次数来提高数据的传输效率。在 Kafka 中,零拷贝技术主要通过使用 mmap 函数实现。mmap 函数将文件映射到内存中,使得应用程序可以直接访问文件内容,而不需要进行数据的复制。这样可以减少数据在内存中的复制次数,提高数据的传输效率。
为什么选择 kafka
首先,Kafka 具有很高的并发处理能力,能够满足金融交易系统对高吞吐量的要求。其次,Kafka 的扩容性非常好,可以很容易地增加服务器节点来提高系统的性能。此外,Kafka 天生适合集群部署,并且使用 Java 和 Scala 编写,便于进行问题排查和维护。相比之下,RabbitMQ 的集群部署相对复杂,而且使用 Erlang 语言,对于一些开发人员来说可能不太熟悉,问题排查也比较困难。
Api 网关用来做什么的?
Api 网关主要用于对第三方调用进行流量限制和安全控制。它可以对请求进行过滤、路由和负载均衡,确保系统的稳定性和安全性。同时,Api 网关还可以提供一些额外的功能,如身份验证、授权、监控和统计等。
支付模块这块怎么做的
参与的项目中,支付模块是由其他同事负责开发的。我主要是通过调用支付模块提供的 API 来实现相关业务功能。在调用 API 时,我会确保参数的正确性和安全性,同时对返回结果进行合理的处理和错误处理。
说一下你们微服务的架构是怎么样的
我们的系统采用了无服务和微服务的混合架构。这种架构可以充分发挥无服务架构的弹性和高效性,同时又能利用微服务架构的灵活性和可扩展性。在具体实现中,我们将一些通用的功能模块封装成无服务函数,通过事件驱动的方式进行调用。而对于一些复杂的业务模块,则采用微服务架构,进行独立开发和部署。
差分升级是怎么实现的
通过对比不同版本的代码,找出差异部分,然后将这些差异部分抽取出来进行计算 MD5 值等操作,以确定是否需要进行升级。在升级过程中,我们会确保数据的完整性和一致性,同时尽量减少对系统的影响。
编译服务类似 CI/CD
通过修改 Git 命令,实现了类似于 Web Hook 的功能。当有代码提交并打上 tag 时,系统会自动进行 Git clone 操作,然后进行测试和编译。这样可以确保代码的质量和稳定性,同时提高开发效率。
C/C++是开发固件的吧
是的,我曾经使用 C/C++ 和 Lua 的组合开发过智能网关。不过,由于我这次是应聘后端开发岗位,所以没有将这部分内容写在简历中。
你很喜欢用 redis?
是的,我非常喜欢使用 Redis。Redis 就像一个数据结构数据库,它提供了丰富的数据结构和操作接口,使用起来非常方便。在项目中,我们使用 Redis 实现了很多业务功能,比如缓存热点数据、实现分布式锁、进行任务队列管理等。
反问
结尾
大家可以看出来,在这场深入的技术面试中,需要应试者具备强大的技术功底和应对各种挑战的能力。面试官询问的方向好像大多是 Kafka 的高并发处理的问题,不知道这次的面经有没有给你带来哪些学习要点呢?也希望通过分享这位面试者的经历,能给正在求职或致力于技术提升的你带来启发和帮助。
欢迎关注 ❤
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。
感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:【infoq 面试群】。
版权声明: 本文为 InfoQ 作者【王中阳Go】的原创文章。
原文链接:【http://xie.infoq.cn/article/668943a4f9b302afdf8e8eec9】。文章转载请联系作者。
评论