高并发组件了解

消息队列

A服务和多个服务耦合,内部维护对多个服务发送数据的接口,那么这些接口如果有的挂了,有的不需要了,那么还得修改A内部的代码,如果使用MQ,A发送消息就好,不必考虑那么多事情。

通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟其它系统彻底解耦了

不需等待整个业务流程走完,把业务需要走的流程发送到MQ,其他服务进行消费走完接下来的流程即可

对短时间的大量请求进行队列内的消息堆积,等待服务进行能力范围内的消费

三种模式:单机,普通集群,镜像集群

单机:玩具

普通集群:多个机器,创建的队列只会存放在 一个实例上,其他实例还得拉取数据,造成了 集群内部的大量流量消耗,而且队列所在节点宕机,数据就丢了,做不到 高可用,但是吞吐量会高一点

镜像集群:创建的队列就会存放在 多个实例上,每次写消息都会同步到所有实例 。 缺点:没有扩展性(queue多了,加机器也没用,因为每个机器上都有完整的数据),性能开销大

每个机器放一部分数据,每个节点内的数据都会有副本,同步到其他机器上,然后选举出一个leader,生产和消费都和他打交道

生产和消费都在所有的follower同步好返回ack之后消息队列才返回操作成功

如何保证消息不被重复消费/如何保证消息消费的幂等性

原因:kafka为例:一条消息消费后会提交offset,下一次消费会从offset后面的数据进行消费,如果消费者进程重启,那么消费过的offset就没有上交,就会导致重复消费

重复消费不可怕,可怕的是没考虑到重复消费之后, 怎么保证幂等性

生产者发送数据时,加一个全局唯一的id,消费时查一下redis是否消费过

如何保证消息的可靠性传输/如何处理消息丢失的问题

生产者弄丢了数据

解决方案:1. 事务机制(耗性能,因为是同步)2. confirm机制(性能号,异步),生产者开启confirm模式,发送的消息分配一个唯一的id,如果送达rabbitmq,会回传一个ack消息,如果送达失败,则会回调一个nack接口,告知接受失败

消息队列弄丢了数据

解决方案:消息队列进行持久化:1. 创建队列时进行持久化。2. 发送消息时吧参数设置为持久化

但是消息队列还没进行持久化就挂了咋办:结合confirm,持久化成功之后再返回ack,如果没有持久化那么生产者是可以进行重发的。

消费者弄丢了数据

关闭自动ack,自己消费后再手动返回ack使消息队列删除消息,如果没有返回ack,消息队列就把消息分配给别的消费者处理。

分库分表后,主键ID处理问题

雪花算法

是把一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bits 作为毫秒数,用 10 bits 作为工作机器 id,12 bits 作为序列号

Original: https://www.cnblogs.com/zz01/p/16533915.html
Author: 山野村夫01
Title: 高并发组件了解

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

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

(0)

大家都在看

  • MySQL查询性能优化七种武器之索引潜水

    有读者可能会一脸懵逼? 啥是 索引潜水? 你给它起名字了吗?你有指数蛙泳吗? [En] Did you give it the name? Do you have index br…

    数据库 2023年5月24日
    0101
  • MySQL实战45讲 20

    20 | 幻读是什么,幻读有什么问题? 建表和初始化语句如下 CREATE TABLE t ( id int(11) NOT NULL, c int(11) DEFAULT NUL…

    数据库 2023年5月24日
    092
  • MySQL的插入性能优化

    MySQL的插入性能优化 修改系统变量的方法 一、通过编辑ini配置文件进行修改; 二、通过输入sql命令进行修改; 查询和修改系统变量; 如果要修改全局变量, 必须要显示指定&#…

    数据库 2023年6月14日
    091
  • Javaweb09-请求跳转项目 分页条件查询 + 增删改 + 邮件登录

    1、Jar 包 UTF-8 1.7 1.7 1.18.12 4.11 5.1.47 1.2.62 javax.servlet javax.servlet-api 3.1.0 pro…

    数据库 2023年6月16日
    091
  • logstash写入文件慢的问题排查记录

    终于找到根本原因了!!!!! logstash部署到k8s集群内部的,当所在节点的CPU资源被其他应用抢占时,logstash的处理速度就会降低 问题现象 logstash从kaf…

    数据库 2023年6月9日
    087
  • Vuex 简单使用

    官网:https://vuex.vuejs.org/zh/ 参考文章:https://www.cnblogs.com/chinabin1993/p/9848720.html Vue…

    数据库 2023年6月16日
    098
  • 9、IDEA回退Git版本

    转载自 在工作中有时候会要求我们将以前提交的代码新开一个分支,而把之前提交的分支回退到以前某个版本 。 方法一: 1、通过IDEA查看Git历史记录,复制当前版本号。 2、 记录当…

    数据库 2023年6月6日
    0120
  • 多商户商城系统功能拆解21讲-平台端分销订单

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

    数据库 2023年6月14日
    0103
  • Win10系统-接口自动化测试持续集成

    使用工具:jdk+jmeter+Ant+jenkins jdk-1.8.0_241版本【安装参考链接:https://blog.51cto.com/u_15463439/52268…

    数据库 2023年6月14日
    096
  • 设计模式之(1)——简单工厂模式

    创建型模式:主要用于对象的创建; 结构型模式:用于处理类或者对象的组合; 行为型模式:用于描述类或对象怎样交互和分配职责; ————————————————————————————…

    数据库 2023年6月14日
    097
  • Fork/Join框架

    我们要使用ForkJoin框架,必须首先创建一个ForkJoin任务。它提供在任务中执行 fork()和 join() 操作的机制,通常情况下我们不需要直接继承ForkJoinTa…

    数据库 2023年6月14日
    082
  • Spring Boot中异步请求和异步调用

    一、SpringBoot中异步请求的使用 1、异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在…

    数据库 2023年6月14日
    088
  • 17-二分查找

    * import java.util.Arrays; import java.util.Random; import java.util.Scanner; public class…

    数据库 2023年6月16日
    084
  • Java Script 原型链原理与继承

    所有对象都有隐式原型; 原型也是对象,也有隐式原型. function User() {}console.log(User.prototype); function User() …

    数据库 2023年6月11日
    069
  • 一份超长的MySQL学习笔记

    前言 最近系统地学习了一边MySQL数据库的基础知识,巩固了一下以前学习的数据库查询基础,又新学习了关于索引、事务等的新内容,做了一些学习笔记。因为MySQL的学习,实操性比较强,…

    数据库 2023年5月24日
    087
  • Java学习-第一部分-第二阶段-项目实战:坦克大战【3】

    坦克大战【3】 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 坦克大战0.6版 √增加功能 2. 记录玩家的成…

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