高级及架构师高频面试题

一、微服务多节点批量应该怎么设计?

1、异步任务分类:

  1. 周期性定时任务调度任务
  2. 批量任务

2、需要考虑并解决的问题:

2.1、避免同一任务同时被多个节点捞取。

        1)数据库的行级锁

        2)redis分布式锁

        3)quartz集群

2.2、需要考虑各节点的本地系统时间差问题。

        场景:某个节点如果很快执行完定时调度任务,另外一个节点的本地时间才到预计执行时间那么就会造成同一个调度任务被重复执行的情况。

        解决办法:

        1)如果使用的数据库,如果采用关系型数据库进行控制,那么任务数据行除了添加执行状态,再增加预计执行完时间字段,每次调度时需要判定系统时间是否大于上一次预计执行完时间,只有大于才会执行,小于说明该任务的本次调度已经被其他节点执行过了,那么所有节点都去争抢下一次执行。

        2)如果使用的redis,则需要带上过期时间并支持续约。

2.3、批量任务需要多节点协同完成

        场景:调用服务发生超时需要进行超时结果确认,将超时确认任务插入任务表等待批量任务调度挨个去执行查证。

        解决方案:

        1)每个节点捞取当前待执行任务状态的任务,如果为0则return,如果不为0则将任务状态变更为执行中,如果更新的条数和查询的条数相等,则执行,否则自调用。如果调度频率较高,可能导致部分节点一直处于自旋状态浪费性能。

        2)增加slot槽点字段(假设在0-1000进行随机),每个节点在查询执行任务之前先计算开始槽点和结束槽点(先通过服务发现查询当前存在的所有批量节点(假设5个)并排序,找到自己的序号(假设为3),开始槽点=1000/5*(3-1),结束槽点就等于开始槽点+1000/5),然后带上槽点条件进行查询。

        3)使用消息队列,每个节点从消息队列获取任务执行。

二、分表后的分页查询问题怎么解决?

1、场景1:历史表和当前业务表分页查询

        如果根据日期排序且查询日期区间有数据落到历史表,则可以先查历史表,然后判断查询结果是否等于pageSize,如果等于0,则查询历史表的total,然后根据total计算应该查询当前表的行数。

2、场景2:按拆分字段水平拆分多个表后的分页查询

       方案1) 全局视野法:

        将所有分表从0开始到当前查询页的数据都查出来到内存中进行重新排序并取出当前页的数据。

        缺点:随着页数增加,会导致内存占用过大。

        方案2)禁止跳页查询:

        不允许跳页查询,只能查下一页,查询时记住每个分表的最大值,然后下一页查询时只需去取每个分表从最大值下一个值开始的一页数据回来到内存中重新排序计算并记录新的最大值。

        缺点:不支持跳页查询

        方案3)二次查询法:

        1)limit offset(all) pageSize 改写成:limit offset(all)/nodeSize pageSize

        用改写后的sql去每个分表查询;

        2)上一步查询的所有分表结果合并后取最小值minInall,合并前每个分表查询结果的最大值为max(i),再改写sql为:between minInall and max(i);

        3)找出minInall在各个分表中的下标为offset(i),则可以计算出minInall在全局视野中的offset,offset(minInall)=offset(1)+offset(2)+offset(3)+...+offset(nodeSize)。

        4)将第2)步中查到的所有结果进行排序,根据offset(all)和offset(minInall)的大小关系可以从排序结果中精确取出需要页的精确数据。

        缺点:只适合于分表数据分布均衡的情况。因为第二次查询取出的数据量大小与每个分表的数据分布情况有关,如果数据分布非常均衡,则可以做到第二次查询每个分表只取出一页的数据量,如果数据分布不均衡则最坏情况下会退化成全局视野法的情况(比如极端情况:每个分表的数据都是按日期升序,这种情况可以根据分表的日期区间升序规律简化算法为场景1的情况)

详细可参考下面博客:

https://www.51cto.com/article/596385.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【运维笔记】数据库无法启动,数据库炸后备份恢复数据

事情起因 在做docker作业的时候,把卷映射到了宿主机原来的mysql数据库目录上,宿主机原来的mysql版本为8.0,docker容器版本为5.6,导致翻车。 具体操作 备份目录 将/var/lib/mysql备份到~/mysql_backup:cp /var/lib/…

Multiview LM-ICP 配准算法

Multiview LM-ICP 配准算法针对一些大型的物体(比如建筑物)或者需要精细化建模的物体(比如某个文物),仅仅进行成对的配准难以还原物体的全貌和细节。所以,多个视角的配准十分关键。 多视角的配准存在以下两…

[STM32]FlyMcu同时烧写BootLoader和APP文件-HEX文件组成

目录 一、前言 二、HEX文件的格式 三、组合HEX文件 四、使用FlyMcu烧录 一、前言 如题,BootLoader每次烧写都是全部擦除,当我们烧写APP程序的时候,BootLoader程序将不复存在,很多开发者或许只有USB转TTL模块,没有其…

grep命令搜索部分命令

首先 然后可以输入|以及grep命令 比如 bjobs| grep "3075*"bjobs| grep "3075"这个结果是这样的,

mysql的存储过程:

mysql的存储过程: 存储过程的概念: 完成特点功能的sql语句的集合。把定义好的sql集合在一个特定的sql的函数当中 每次执行调用函数即可,还可以实现传参的调用 存储过程的语法: delimiter $$ #delimiter 开始和结束的语法&…

MYSQL 第四次作业

任务要求: 具体操作: 新建数据库: mysql> CREATE DATABASE mydb15_indexstu; Query OK, 1 row affected (0.01 sec) mysql> USE mydb15_indexstu; Database changed 新建表: mysql> CREATE TABLE student( ->…

遇到总条数count(*)返回不了数据

文章目录 前提1.准备数据1.1 建表语句1.2 插入数据 2.程序代码3.返回结果与分析4.验证 前提 获取h_user表中count(*)字段的值打印出来,打印出来是0,数据库中执行sql返回不是0。端点调试找到原因。下面先把数据库表数据及程序贴出来。 1.准备数据 1.1 …

CSS技巧专栏:一日一例 12 -纯CSS实现边框上下交错的按钮特效

CSS技巧专栏:一日一例 12 -纯CSS实现边框上下交错的按钮特效 大家好,今天我们来做一个上下边框交错闪动的按钮特效。 本例图片 案例分析 虽说这按钮给人的感觉就是上下两个边框交错变换了位置,但我们都知道border是没法移动的。那么这个按…

【无标KaiwuDB CTO 魏可伟:差异化创新,面向行业的多模架构题】

2024年7月16日,KaiwuDB CTO 魏可伟受邀于 2024 可信数据库发展大会主论坛发表演讲《多模一库 —— KaiwuDB 的现代数据库架构探索》,以下是演讲精华实录。 多模数据库 是顺应时代发展与融合趋势的产物 数据模型最早始于网状模型和层次模型,…

Spark实时(五):InputSource数据源案例演示

文章目录 InputSource数据源案例演示 一、​​​​​​​File Source 1、读取text文件 2、读取csv文件 3、读取json文件 二、Socket Source 三、Rate Source InputSource数据源案例演示 在Spark2.0版本之后,DataFrame和Dataset可以表示静态有边界的数据&am…

移动式气象站:便携科技的天气守望者

在科技日新月异的今天,我们身边的许多设备都在向着更加智能化、便携化的方向发展。而在气象观测领域,移动式气象站的出现,不仅改变了传统气象观测的固有模式,更以其灵活性和实时性,在气象监测、灾害预警等领域发挥着越…

MySQL练习05

题目 步骤 触发器 use mydb16_trigger; #使用数据库create table goods( gid char(8) primary key, name varchar(10), price decimal(8,2), num int);create table orders( oid int primary key auto_increment, gid char(10) not null, name varchar(10), price decima…

基于python的BP神经网络红酒品质分类预测模型

1 导入必要的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from tensorflow.keras.models import Sequential from tenso…

NET8部署Kestrel服务HTTPS深入解读TLS协议之Certificate证书

Certificate证书 Certificate称为数字证书。数字证书是一种证明身份的电子凭证,它包含一个公钥和一些身份信息,用于验证数字签名和加密通信。数字证书在网络通信、电子签名、认证授权等场景中都有广泛应用。其特征如下: 由权威机构颁发&…

跟李沐学AI:池化层

目录 二维最大池化 填充、步幅和多个通道 平均池化层 池化层总结 二维最大池化 返回滑动窗口中的最大值。 图为池化窗口形状为 22 的最大池化层。着色部分是第一个输出元素,以及用于计算这个输出的输入元素: max(0,1,3,4)4。池化层与卷积层类似,不断…

Spark核心知识要点(八)Shuffle配置调优

1、Shuffle优化配置 -spark.shuffle.file.buffer 默认值:32k参数说明:该参数用于设置shuffle write task的BufferedOutputStream的buffer缓冲大小。将数据写到磁盘文件之前,会先写入buffer缓冲中,待缓冲写满之后,才会…

Linux中,MySQL的用户管理

MySQL库中的表及其作用 user表 User表是MySQL中最重要的一个权限表,记录允许连接到服务器的帐号信息,里面的权限是全局级的。 db表和host表 db表和host表是MySQL数据中非常重要的权限表。db表中存储了用户对某个数据库的操作权限,决定用户…

单元测试的最佳实践

整体架构 合适的架构可以提升可测试性。比如菱形对称架构的模块化和解耦特性使得系统各个部分可以独立进行单元测试。这不仅提高了测试的效率,还能够减少测试的依赖性,提高测试准确性。 代码设计 代码设计和可测试性有密切关联。强烈建议一个方法的代码行…

Android 15 适配整理——实践版

背景 谷歌发布Android 15后,国内的手机厂商迅速行动,开始了新系统的适配工作。小米、OPPO、vivo和联想等金标联盟成员联合发布了适配公告,督促APP开发者在2024年8月31日前完成适配工作,否则将面临搜索标签提示、应用降级、分机型…

JavaWeb笔记_JSTL标签库JavaEE三层架构案例

一.JSTL标签库 1.1 JSTL概述 JSTL(jsp standard tag library):JSP标准标签库,它是针对EL表达式一个扩展,通过JSTL标签库与EL表达式结合可以完成更强大的功能 JSTL它是一种标签语言,JSTL不是JSP内置标签 JSTL标签库主要包含: ****核心标签 格式化标签 …