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

从前,有个女生宿舍,住着小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/576436/

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

(0)

大家都在看

  • 数据中有emoji,导致插入不了数据库

    前言 前两天负责的系统,因为需要获取用户的昵称并进行入库,但是有个别用户的昵称中存在emoji表情,导致入库时报错。 报错内容: java.sql.SQLException: In…

    数据库 2023年5月24日
    0118
  • MySQL索引(一)

    一、索引概念 二、索引类型 (一)业务逻辑分类 1、NORMAL – 普通索引 2、UNIQUE – 唯一索引 3、PRIMARY KEY – …

    数据库 2023年6月16日
    097
  • 二分查找及其应用

    概述 二分查找算法是一种效率极高的算法,也是为数不多时间复杂度在 O(logn)量级的算法。算法思想并不难理解,但是某些细节却十分复杂,…

    数据库 2023年6月11日
    066
  • CenoOS 7环境下编译OpenJDK8

    一、准备工作 1.1、不再使用”$make sanity”来检查编译环境,而是改用”$./configure” 1.2、不再使用an…

    数据库 2023年6月9日
    082
  • day39-网络编程01

    Java网络编程01 1.网络相关的概念 1.1网络通信和网络 *网络通信 概念:两台设备之间通过网络实现数据传输 网络通信:将数据通过网络从一台设备传输到另一台设备 java.n…

    数据库 2023年6月11日
    0103
  • 什么是回表,怎么解决?

    表tbl有a,b,c三个字段,其中a是主键,b上建了索引,然后编写sql语句SELECT * FROM tbl WHERE a=1这样不会产生回表,因为所有的数据在a的索引树中均能…

    数据库 2023年5月24日
    081
  • 时序数据库InfluxDB的基本语法

    一 了解InfluxDB的必要性 Time series data is a series of data points each associated with a specif…

    数据库 2023年6月16日
    097
  • 多商户商城系统功能拆解30讲-平台端营销-商家优惠券

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    097
  • Question09-查询学过编号为”01″并且也学过编号为”02″的课程的同学的信息

    * — 学过01,且学过02 — 学过01 SELECT sc.SID FROM SC sc WHERE sc.CID = ’01’; — 学过02 SELECT sc.SI…

    数据库 2023年6月16日
    071
  • mysql解压版简洁式本地配置方式

    1. 设置全局变量 解压mysql压缩包到指定位置, 然后配置全局变量, 在 path 中添加全局变量, 值为 mysql 根目录下 bin 目录路径, 比如: D:\code_s…

    数据库 2023年5月24日
    0130
  • Spring Boot yml 公共抽取

    项目里面的yml文件为了区别线上、测试、本地环境,分别有application-prod.yml,application-dev.yml,application-local.yml…

    数据库 2023年6月6日
    085
  • 【MySQL】MySQL的安装、卸载、配置、登陆和退出

    1 MySQL安装 安装环境:Win10 64位软件版本:MySQL 5.7.24 解压版 1.1 下载 https://downloads.mysql.com/archives/…

    数据库 2023年6月16日
    092
  • MySQL实战45讲 9

    09 | 普通索引和唯一索引,应该怎么选择? 每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的…

    数据库 2023年5月24日
    0109
  • 百度我为你伤心

    9月9日 我写了一篇文章,原名:事务方块,后改名:事务的本质和死锁的原理 9月10日23点 我突然发现,这个原创文章被转载盗贴,可气的是都没有记录原创地址 早上我查了一下搜索引擎排…

    数据库 2023年6月9日
    092
  • mysql视图,索引

    一、视图 View 视图是一个 虚拟表,是sql语句的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图的数据变化会影响到基…

    数据库 2023年6月9日
    069
  • 聊斋-河间生

    人的善恶在转瞬之间就可以改变,发现错误时往往已经差之千里了,但是发现错误及时改正这不也是很美好的一件事情么?河间生就是讲了这么一件事情。 主角简介:河间某生,家里比较富裕,烧火用的…

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