从前,有一个简单的通道系统叫尤娜……

从前,有个女生宿舍,住着小A、小B、尤娜和我4个人。有天,小A不小心把小B的床板坐塌了。小B非常生气,当场和小A翻脸。不论人缘最好的尤娜怎么中间调解都不管用。一直到毕业,小A和小B再没有说过一句话。

后来,小A、小B和尤娜都成了公司老板,只有我一事无成。小A公司需要使用小B公司的系统,小A还记着当年的事情,没敢直接找小B,就找尤娜商量。尤娜就找到小B诉说原委。有生意小B自然是愿意做的,但是想到关系这么僵了,还是放不下身段。尤娜叹了口气:”这样吧,我们公司做一个系统,你俩都来接我吧。”

于是,尤娜成立了一个以自己名字命名的项目,看着我实在找不到工作,就让我自学编程,给她做开发。于是尤娜初版就这样上线了。架构是这样的:

从前,有一个简单的通道系统叫尤娜……

我还只是个菜鸟,所以我的做法只是把B的http接口包装了一下,其他什么也没有做。上线之后,我发现A的调用请求一天有几个时间调用量特别大,小B公司的老师说:”扛不住了,不要把流量直接透传过来呀!”

我通过自己的学习调查,发现可以使用消息中间件做个缓冲。当A请求过来,我先把请求放到消息队列里,然后再自己消费后转发请求给B。因为消费是匀速的,就起到了削峰填谷的作用。

但是这样,我怎么把返回结果再返回给A呢?聪明如我怎么会想不到办法,我把B返回的结果记录到数据库中。当A的请求发送到消息中间件后就循环去数据库里取结果,取到就返回这个结果给A。完美!

于是我跟尤娜商量了这个想法,尤娜是我的好姐妹,我的想法她马上表示支持,让我放手去做,资源呀什么都不是问题。

我按照网上找到的《项目中怎样做技术选型》的文章,结合目前的特点,优缺点比较之后,消息中间件使用kafka,数据库使用mysql。经过自己的努力,尤娜第二版上线啦。架构是这样的:

从前,有一个简单的通道系统叫尤娜……

kafka集群的内部架构,我是参考《Kafka生产端实际项目中的使用分析》这篇文章,使用zookeeper做分布式协调。上线不久后,意想不到的事情发生了:kafka broker集群挂了。不管三七二十一先重启再说。

重启之后,尤娜消费端没有恢复,每隔3ms报一个warn日志:

Auto offset commit failed for group XXX:

Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member.

This means that the time between subsequent calls to poll() was longer than the configured max.poll.interval.ms,

which typically implies that the poll loop is spending too much time message processing.

我根据auto offset commit failed(自动提交offset失败了)这个信息在网上搜索了一下。通过之前的学习我知道:kafka的数据更新消费都是通过在zookeeper中标记一个偏移量(offset)来记录每个分区的消费位置,所以一旦offset更新失败,会出现重复消费数据的问题。

最终我分总结出:kafka消费者在处理消息时,在指定时间内(session.time.out)没有处理完。kafka消费要在消息处理完之后,自己提交当前的offset给kafka集群。而这时候已经超时断开连接了,导致自动提交offset失败。因此就会像日志中所说的发生rebalanced(重平衡即重新分配partition给客户端),而之前提交的offset已经失败了,所以重新分配的客户端又会消费之前的数据,接着consumer重新消费,又出现了消费超时,无限循环下去。

出现这个原因是因为我客户端使用时就是使用了spring-kafka,只用了一个@KafkaListener,没有修改任何默认配置。而默认enable.auto.commit设置成true,可以改为false,不采用自动提交方式。所谓不自动提交实际上是消费端收到消息不先处理而是先提交offset再处理。

这种解决方案,万一提交了offset之后消费失败了不会再次处理。这样次数多了向A不好交代呀。还是先不改了。我决定先修改session.time.out时间设置长一些,重启解决问题。

目前服务已经恢复了正常,作为菜鸟新人解决了问题觉得好激动。但是实际上细想还有好多问题没有弄明白,比如:kafka broker集群为什么挂了?太晚了,先睡觉再说。

突然想起那时候在宿舍我们四个一起读《飘》的情景,特别喜欢里面那句名言:无论如何,明天又是新的一天!

后记:

尤娜系统的第一次飞行中换引擎的架构垂直拆分改造

四种常用的微服务架构拆分方式

Original: https://www.cnblogs.com/xiexj/p/15979929.html
Author: 编程一生
Title: 从前,有一个简单的通道系统叫尤娜……

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610339/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【转】windows下Redis的安装和使用

    2、在下载网页中,找到最后发行的版本(此处是3.2.100)。找到Redis-x64-3.2.100.msi和Redis-x64-3.2.100.zip,点击下载。这里说明一下,第…

    Linux 2023年5月28日
    097
  • zookeeper与kafka集群部署实现

    安装java依赖环境 配置zookeeper 启动zookeeper 检查状态 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。该项目的目…

    Linux 2023年6月7日
    0198
  • CentOS 压缩解压

    打包:将多个文件合成一个总的文件,这个总的文件通常称为 “归档”。 压缩:将一个大文件通过某些压缩算法变成一个小文件。 1.1、tar 压缩格式: tar …

    Linux 2023年6月8日
    095
  • WEB自动化-07-Cypress Test Runner

    7 Test Runner 7.1 概述 Test Runner是Cypress非常重要一个组件,其主要作用为运行测试、更改配置、将运行的测试结果写入控制台等等。 打开Cypres…

    Linux 2023年6月7日
    0101
  • 【Example】C++ STL 常用容器概述

    前排提醒: 由于 Microsoft Docs 全是机翻。所以本文表格是我人脑补翻+审校。 如果有纰漏、模糊及时反馈。 了解每一种容器的特性、知道什么情况下用什么容器就可以。 序列…

    Linux 2023年6月13日
    087
  • 如何在博客中添加Aplayer音乐播放器

    前言 是否有一首音乐,前奏一响起,让你灵魂不自主的颤栗。音乐就像老胶卷,每个旋律,每句歌词,都承载着每个人的往事回忆和情愫感受。 我收藏了好多的音乐,奈何好多音乐受版权限制,需要购…

    Linux 2023年6月7日
    0107
  • Linux Netlink学习笔记

    Netlink是用户程序与内核通信的socket方法,通过Netlink可以获得修改内核的配置,常见的有获得接口的IP地址列表、更改路由表或邻居表。旧版本的内核提供很多从内核获取信…

    Linux 2023年6月6日
    0114
  • 十六.大数据平台及组件安装部署

    Hadoop全分布部署 Hadoop集群验证 使用jps查看各个节点启动的进程情况 [hadoop@master ~]$ jps 2224 ResourceManager 2487…

    Linux 2023年6月8日
    0125
  • Linux NFS服务配置

    bash;gutter:true; 服务端配置: 1. 安装nfs-utils和rpcbind</p> <h1>yum install nfs-utils …

    Linux 2023年6月13日
    082
  • redis client原理分析

    1:空闲连接池实现 空闲连接池存在一个双向链表中,一个连接用完后回收,就会从表头插入这个链表,当需要一个连接时也是从链表的表头取,从表头插入的时候会写入当前时间,所以链表是一个按时…

    Linux 2023年5月28日
    0104
  • 增加Apache响应时间

    在apache的配置文件 httpd.conf 最下面加上下面代码,增加响应时间 FcgidProcessLifeTime 8200 FcgidIOTimeout 8200 Fcg…

    Linux 2023年6月7日
    0105
  • Windows+VSCode编译在Linux-x86_64环境上运行的程序

    一、简介 本文主要介绍在Windows平台上使用VSCode,从而可以一键编译出运行在Linux-x86_64环境中的程序或库。 二、实现方式 ① 交叉编译 ② WSL(Windo…

    Linux 2023年6月7日
    0103
  • burp通过条件竞争上传文件

    一·何为条件竞争现代框架更能抵御此类攻击。他们通常不会将文件直接上传到文件系统上的预期目的地。相反,他们采取了预防措施,例如首先上传到临时的沙盒目录并随机命名以避免覆盖现有文件。然…

    Linux 2023年6月7日
    092
  • MySQL日志管理之事务日志和错误日志

    MySQL的日志是用来记录用户的相关操作、系统的运行状态等信息的文件结合。 事务日志就是mysql执行事务过程中产生的日志。 redo log:基于WAl机制在数据更改前先把对应操…

    Linux 2023年6月7日
    098
  • nginx-add_header指令

    介绍 前端子系统由于业务形态,会有各种相同根域名的子系统相互调用,这时候就需要相应的子系统在nginx上支持跨域配置。 业务使用的样例 add_header ‘Access-Con…

    Linux 2023年6月6日
    0111
  • KMS官网链接(无毒)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0106
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球