高并发组件了解

消息队列

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/586958/

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

(0)

大家都在看

  • Java学习-动手动脑2

    public void println() { newLine(); } /** * Prints a boolean and then terminate the line. T…

    Java 2023年6月9日
    074
  • 邮件任务-springboot

    springboot可以很容易实现邮件的发送 具体实现步骤: org.springframework.boot spring-boot-starter-mail 2.5.2 spr…

    Java 2023年6月13日
    073
  • LeetCode随缘刷题之转化成小写字母

    这道题应该是最简单的一道题了把,简直在侮辱我。 package leetcode.day_12_12; public class ToLowerCase0709 { public …

    Java 2023年6月7日
    068
  • 华为交换机如何配置SSH远程登录,一分钟秒学会

    从事网络运维工作的小伙伴们都知道,在交换机正式上线时,必须完成配置SSH远程登录,这样做目的是为了日后,维护方便,不需要每次登录设备都要跑到机房,这样既不现实,又费事。 远程登录方…

    Java 2023年6月8日
    078
  • Spring MVC之@RequestMapping 详解

    (转自:http://blog.csdn.net/walkerjong/article/details/7994326) 引言: 前段时间项目中用到了RESTful模式来开发程序,…

    Java 2023年5月30日
    060
  • 继承中的初始化和加载

    继承关系中的执行顺序代码 package onjava8.extend; /** * 继承关&#x7CFB…

    Java 2023年6月15日
    075
  • Java——基础

    public class Hello{     public static void main(String[] args){         System.out.print(&…

    Java 2023年6月5日
    070
  • springCloud中增加gateway(超详细)

    地址:https://blog.csdn.net/qq_42815754/article/details/94622244 此博客只是为了记忆相关知识点,大部分为网络上的文章,在此…

    Java 2023年5月30日
    083
  • IOS html页面输入框焦点获取和释放时,页面滚动技巧

    var htmlScrollHeight = $(document).scrollTop();//记录页面初始滚动条到顶部的高度 $(‘input’).bl…

    Java 2023年6月5日
    072
  • Liunx-CentOS安装MySQL8

    0 卸载 0.1 卸载原有的MariaDB 查看MariaDB安装包 rpm -qa | grep mariadb 卸载MariaDB rpm -e mariadb-libs-5….

    Java 2023年6月9日
    090
  • Nginx反向代理的几种配置模板

    因为内网服务越来越多,各种IP加端口地址根本记不住,于是用Nginx做反响代理,也可以很好管理内网的地址分发。 下面提供几种Nginx配置模板。因为也是自己摸索着配置的,有错误的地…

    Java 2023年5月30日
    084
  • 马士兵多线程直播笔记(上)

    线程与进程 进程: 操作系统分配资源的基本单位。 线程:CPU调度(执行)的基本单位。共享进程的资源。 一个CPU同一时间只能执行一个线程, 表象是线程切换(Context Swi…

    Java 2023年5月30日
    082
  • java 方法调用绑定

    将一个方法调用同一个方法主体关联起来被称作绑定。若在程序执行前进行绑定(由编译器和连接器实现),叫做前期绑定。读者可能从来没有听说过这个术语,因为它在面向过程语言中不需要选择就默认…

    Java 2023年5月29日
    075
  • windows media play javascript 全屏 单击事件

    上面代码放在HTML页面中, 倒数三行的设置,是对应如果你要做JAVASCRIPT里是否要获取到,0是false,只是不明白为什么-1是true, 然后在HTML里面加入 docu…

    Java 2023年6月14日
    070
  • 基于JDK的动态代理原理分析

    基于JDK的动态代理原理分析 这篇文章解决三个问题: What动态代理是什么 How动态代理怎么用 Why动态代理的原理 动态代理是什么? 动态代理是代理模式的一种具体实现,是指在…

    Java 2023年6月7日
    084
  • simHash 简介以及 java 实现

    传统的 hash 算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法。产生的两个签名,如果相等,说明原始内容在一定概 率 下是相等的;如果不相等,除了…

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