当前位置: 首页 > news >正文

分布式解决方案与实战

分布式多线程性能调优

使用多线程优化接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

	//下单业务public Object order( long userId){long start = System.currentTimeMillis();//方法的开始时间戳(ms)JSONObject orderInfo = remoteService.createOrder(userId);Callable<JSONObject> callable1 = new Callable<JSONObject>() {@Overridepublic JSONObject call() throws Exception {JSONObject goodsInfo = remoteService.dealGoods(orderInfo);return goodsInfo;}};Callable<JSONObject> callable2 = new Callable<JSONObject>() {@Overridepublic JSONObject call() throws Exception {JSONObject pointsInfo = remoteService.dealPoints(orderInfo);return pointsInfo;}};Callable<JSONObject> callable3 = new Callable<JSONObject>() {@Overridepublic JSONObject call() throws Exception {JSONObject deliverInfo = remoteService.dealDeliver(orderInfo);return deliverInfo;}};LeeFutureTask<JSONObject> task1 = new LeeFutureTask(callable1);LeeFutureTask<JSONObject> task2 = new LeeFutureTask(callable2);LeeFutureTask<JSONObject> task3 = new LeeFutureTask(callable3);Thread thread1 =new Thread(task1);Thread thread2 =new Thread(task2);Thread thread3 =new Thread(task3);thread1.start();thread2.start();thread3.start();try {orderInfo.putAll(task1.get());orderInfo.putAll(task2.get());orderInfo.putAll(task3.get());} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}long end = System.currentTimeMillis();//方法的开始时间戳(ms)System.out.println(end-start);//打印这个方法的执行时间return orderInfo;}

后台批处理的优化

在这里插入图片描述

public JSONObject orderFastbatch (long userId) throws Exception{JSONObject orderInfo = remoteService.createOrderFast(userId);//JSONObject goodsInfo = remoteService.dealGoodsFast(orderInfo); //这里是单个的请求,想做成批量+异步的方式//orderInfo.putAll(goodsInfo);CompletableFuture<JSONObject> future = new CompletableFuture<>();Request request = new Request();request.future =future;request.object = orderInfo;queue.add(request);return future.get(); //这里类似于FutureTask  的get方法,去异步的方式拿结果}//定义一个JUC中的MQLinkedBlockingQueue<Request> queue = new LinkedBlockingQueue();class Request{JSONObject object;CompletableFuture<JSONObject> future;}@PostConstructpublic void DoBiz(){ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);executorService.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {int size =queue.size();if(size ==0) return;//没有数据在queue中,定时任务不需要执行什么if(size >1000) size=1000;//这里限制每次批量封装的最多是1000List<JSONObject> ListJSONRepuest = new ArrayList<>();List<Request>  ListRequest = new ArrayList<>();for( int i =0 ;i <size;i++){Request request =queue.poll();//从MQ中拉取ListRequest.add(request);ListJSONRepuest.add(request.object);}//调用了多少次批量接口List<JSONObject> ListJSONReponse  = remoteService.dealGoodsFastBatch(ListJSONRepuest);System.out.println("调用批量接口,本地组装的数据:"+size+"条");for(JSONObject  JSONReponse:ListJSONReponse){//这里可以使用hashmap 的方式减少一轮遍历。for(Request  request:ListRequest){String  request_OrderId =request.object.get("orderId").toString();String  response_OrderId =JSONReponse.get("orderId").toString();if(request_OrderId.equals(response_OrderId)){request.future.complete(JSONReponse);}}}}}, 3000, 50, TimeUnit.MILLISECONDS);}
//处理库存信息 (批量接口)  1000,public List<JSONObject> dealGoodsFastBatch( List<JSONObject> objectList) {List<JSONObject> list = objectList;Iterator it = list.iterator();while(it.hasNext()){JSONObject result =(JSONObject)it.next();result.put("dealGoods", "ok");}return  list;}

批处理与MySQL的综合性优化

如果做了批量处理的话。
1W个请求,高并发请求,其实里面针对的修改库存会集中在一些热点数据8000个在一个商品。
应用层基于批量的接口进行优化。
伪代码:
for循环遍历list,把所有相同的goods_id放到hashmap进行扣减计数即可。

分布式锁

单机锁:sync、lock
MySQL去实现分布式锁–for update (行锁)

Redis

分布式锁的第一种常见方案:Redis来实现分布式锁。Redis key-value键值对的数据库–内存。

Redis的分布式锁的实现逻辑:
1、加锁,setnx key value
1)为了避免死锁问题setnx完之后设置TTL失效时间
2)为了TTL的失效的时候业务还未完成导致的多个应用抢到锁的BUG,这里可以使用一个守护线程,来不断的去续锁(延长key的TTL)

2、解锁del key
无论是加锁,还是解锁,这里涉及到多个命令。要解决原子性问题:
1、复合命令实现加锁。set lock 9527 ex 10 nx
2、解锁的逻辑中:在del之前一定要判断:只有持有锁的应用或线程,才能去解锁成功,否则都是失败。value做文章。存一个唯一标识。

if (get ==应用的保存的值)del
else释放锁失败

使用Lua脚本

锁的可重入。A抢到了锁,没有释放锁之前,依然可以lock进入加锁逻辑的。

Zookeeper

在这里插入图片描述
1、连接ZK、创建分布式锁的根节点/lock
2、一个线程获取锁时,create ()在/lock西面创建1个临时顺序节点3、使用getChildren()获取当前所有字节点,并且对子节点进行排序
4、判断当前创建的节点是否是所有子节点中最小的节点,如果是,则获取锁->执行对应的业务逻辑->在结束的时候使用delete()方法删除该节点。
否则需要等待其他的节点的释放锁、
5、当一个线程需要释放锁的,删除该节点,其他的线程获取当前节点前的一个节点来获取锁。

相关文章:

分布式解决方案与实战

分布式多线程性能调优 使用多线程优化接口 //下单业务public Object order( long userId){long start System.currentTimeMillis();//方法的开始时间戳&#xff08;ms&#xff09;JSONObject orderInfo remoteService.createOrder(userId);Callable<JSONObject> calla…...

GitHub入门介绍

GitHub是一个基于web的版本控制系统&#xff0c;主要用于代码管理和协作开发。它是开源的&#xff0c;并且提供了一系列的功能&#xff0c;方便开发人员进行版本控制、代码托管和团队协作。 以下是GitHub的一些基本概念和功能&#xff1a; 版本控制&#xff1a;GitHub使用Git作…...

IP与子网掩码之间的关系

子网掩码用于确认IP所在的网段&#xff0c;网络位与子网掩码相匹配 如果有另一台主机想要与这个IP地址进行通信&#xff0c;这时需要看两台主机的IP地址是否处于同一网段&#xff0c;处于同一网段才能相互ping通。 那么怎么判断是否处于同一网段呢&#xff1f;我们就看子网掩…...

文档或书籍扫描为 PDF:ScanPapyrus Crack

ScanPapyrus 可让您快速轻松地将文档或书籍扫描为 PDF&#xff0c;批处理模式使扫描过程快速高效&#xff0c;自动处理书籍并将其拆分为单独的页面 用于快速扫描文档、书籍或打印照片的扫描仪软件 快速扫描文档 使用此扫描仪软件&#xff0c;您无需在扫描仪和计算机之间来回移动…...

Clickhouse RoaringBitmap

https://blog.csdn.net/penriver/article/details/119736050 https://juejin.cn/post/7179956435806076988 BitMap适合连续密集的正整数存储&#xff0c;对于稀疏的正整数存储&#xff0c;其性能在很多时候是没办法和int数组相比的&#xff0c;尤其是正整数跨度较大的场景&…...

C语言第四十九弹----模拟使用strcpy函数

使用C语言模拟使用strcpy函数 定义&#xff1a;strcpy 函数是 C 标准库中用于字符串复制的函数。它接受两个参数&#xff0c;第一个参数 dest 是目标字符串的指针&#xff0c;第二个参数 src 是源字符串的指针&#xff0c;函数的功能是将源字符串复制到目标字符串中&#xff0…...

docker搭建maven私库Nexus3

什么是Maven私服&#xff1f; Maven 私服是一种特殊的Maven远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远程仓库&#xff08;中央仓库、其他远程公共仓库&#xff09;。 当然也并不是说私服只能建立在局域网&#xff0c;也有很多公司会…...

Java 基础学习(十)包装类、异常

1 包装类 1.1 包装类概述 1.1.1 什么是包装类 在进行类型转换时&#xff0c;有一种特殊的转换&#xff1a;将 int 这样的基本数据类型转换为对象&#xff0c;如下图所示&#xff1a; 所有基本类型都有一个与之对应的类&#xff0c;即包装类&#xff08;wrapper&#xff09;。…...

STM32的基本定时器注意点

本文介绍了STM32基本定时器3个重要的寄存器PSC、ARR、CNT&#xff0c;以及缓冲机制和计数细节。 基本定时器的框图 预分频器寄存器(TIMx_PSC)可以在运行过程中修改它的数值&#xff0c;新的预分频数值将在下一个更新事件时起作用。因为更新事件发生时&#xff0c;会把 TIMx_PS…...

浅谈NLP和大模型的关系

目录 一、什么是NLP 二、NLP的应用举例 三、NLP的Python实现举例 四、NLP和大模型的关系 五、NLP的难点 5.1 内容的有效界定 5.2 消歧和模糊性 5.3 有瑕疵的或不规范的输入 5.4 语言行为与计划 六、研究热点 一、什么是NLP 如果单独说NLP这3个字母&#xff0c;具有两…...

k8s上安装KubeSphere

&#x1f369;安装KubeSphere &#x1f36a;前置环境&#x1f36a;安装nfs-server文件系统&#x1f36a;配置nfs-client&#x1f36a;配置默认存储&#x1f36a;创建了一个存储类&#x1f36a;metrics-server集群指标监控组件 &#x1f36a;安装KubeSphere&#x1f36a;执行安装…...

Linux 链接器如何使用静态库来解析引用

文章目录 通过进行代码实践静态库在编译时被链接到可执行文件中的基本原理原理总结 QA:.obj文件是什么? 通过进行代码实践 链接器在解析引用时&#xff0c;可以使用静态库来满足对未定义符号的引用。以下是使用静态库的一般步骤&#xff1a; 编写代码&#xff1a; 首先&#…...

vue实现滑动验证

效果图&#xff1a; 源码地址&#xff1a;github文档地址&#xff1a; https://github.com/monoplasty/vue-monoplasty-slide-verify 使用步骤&#xff1a;1&#xff0c;安装插件&#xff1a; npm install --save vue-monoplasty-slide-verify 在main.js中使用一下&#xff…...

***Cpolar配置外网访问和Dashy

Dashy是一个开源的自托管的导航页配置服务,具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起,形成自己的导航页。一款功能超强大,颜值爆表的可定制专属导航页工具 结合cpolar内网工具,我们实现无需部署到公网服务器…...

Rancher中使用promtail+loki+grafna收集k8s日志并展示

Rancher中使用promtail+loki+grafna收集k8s日志并展示 根据应用需求和日志数量级别选择对应的日志收集、过滤和展示方式,当日志量不太大,又想简单集中管理查看日志时,可使用promtail+loki+grafna的方式。本文找那个loki和grafana外置在了k8s集群之外。 1、添加Chart Repo …...

modelbox线程爆满宕机bug

序 该bug的解决需要特别感谢张同学。有了大佬的帮助&#xff0c;这个bug才得以解决。 问题现象 modelbox可以进行模型推理&#xff0c;但压测一段时间后&#xff0c;modelbox会宕机&#xff0c;并发生段错误。 “libgomp: Thread creation failed: Resource temporarily una…...

KUKA机器人如何在程序中编辑等待时间?

KUKA机器人如何在程序中编辑等待时间&#xff1f; 如下图所示&#xff0c;如何实现在P1点和P2点之间等待设定的时间&#xff1f; 如下图所示&#xff0c;可以直接输入wait sec 2&#xff08;等待2秒&#xff09;&#xff0c; 如下图所示&#xff0c;再次选中该程序后&#…...

MQ入门简介

当年入门MQ时跟着尚硅谷RabbitMQ视频学习所做的一些笔记&#xff0c;现在上传方便有需要小伙伴查看 一&#xff1a;MQ的相关概念 1.什么是MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内…...

如何正确使用缓存来提升系统性能

文章目录 引言什么时候适合加缓存&#xff1f;示例1示例2&#xff1a;示例3&#xff1a; 缓存应该怎么配置&#xff1f;数据分布**缓存容量大小&#xff1a;**数据淘汰策略 缓存的副作用总结 引言 在上一篇文章IO密集型服务提升性能的三种方法中&#xff0c;我们提到了三种优化…...

IDEA中Terminal配置为bash

简介 我们日常命令行都是使用Linux的bash指令&#xff0c;但是我们的开发基本都是基于Windows上的IDEA进行开发的&#xff0c;对此我们可以通过将IDEA将终端Terminal改为git bash自带的bash.exe解决问题。 配置步骤 安装GIT 这步无需多说了&#xff0c;读者可自行到官网下载…...

奥里亚语语音合成准确率骤降?揭秘ElevenLabs最新v4.2模型在Odisha方言中的5大发音偏差与3步校准法

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;奥里亚语语音合成准确率骤降现象全景透视 近期多个基于深度学习的奥里亚语&#xff08;Odia&#xff09;TTS系统在部署后出现显著性能退化&#xff1a;词级发音准确率从92.4%骤降至73.1%&#xff0c;尤…...

Linux系统下Vue开发环境搭建:从Node.js到Vite的完整指南

1. 项目概述&#xff1a;为什么要在Linux上搭建Vue环境&#xff1f;对于前端开发者而言&#xff0c;Vue.js 早已不是陌生的名字。它凭借其渐进式的设计理念、灵活的组件化系统和相对平缓的学习曲线&#xff0c;成为了构建现代Web应用的主流框架之一。然而&#xff0c;很多开发者…...

新手必看!CTFShow文件上传靶场通关保姆级教程(Web151-170全解析)

CTFShow文件上传靶场全解析&#xff1a;从入门到精通的实战指南 初识文件上传漏洞 文件上传功能几乎是每个Web应用都具备的基础模块&#xff0c;但恰恰是这个看似简单的功能&#xff0c;成为了无数安全漏洞的温床。在CTF竞赛中&#xff0c;文件上传类题目因其直观性和实战性&am…...

独立开发者如何利用Taotoken应对不同客户项目的多样化模型需求

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何利用Taotoken应对不同客户项目的多样化模型需求 作为一名独立开发者或小型工作室的成员&#xff0c;你很可能同时维…...

书成紫微动,律定凤凰驯:《第一大道》破的是资本,《凰标》立的是民心

书成紫微动&#xff0c;律定凤凰驯。 ——千年古谶&#xff0c;道破治乱循环&#xff1a; 乱世由乱象所积&#xff0c;盛世由人心所筑。一、困局&#xff1a;资本驯化文艺的三重锁链锁链症状结果垄断话语权曝光渠道、评价标准、出圈资源尽归资本民间佳作被算法活埋绑架审美流水…...

高速PCB设计中串扰的成因、影响与实战控制策略

1. 项目概述&#xff1a;高速硬件设计中的“隐形杀手”干了十几年硬件设计&#xff0c;从当年画双面板、用万用表调通就行的年代&#xff0c;一路做到现在动辄几十层、信号速率奔着几十Gbps去的复杂系统&#xff0c;感触最深的一点就是&#xff1a;很多问题&#xff0c;以前可以…...

借助 Taotoken 多模型聚合能力为开源项目构建智能问答机器人

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 借助 Taotoken 多模型聚合能力为开源项目构建智能问答机器人 为开源项目添加一个智能问答助手&#xff0c;能显著提升社区体验&…...

国产多模态大模型“看懂”世界:视觉问答(VQA)全解析

国产多模态大模型“看懂”世界&#xff1a;视觉问答(VQA)全解析 引言 在人工智能浪潮中&#xff0c;让机器“看懂”图片并回答问题的能力&#xff0c;正从科幻走向现实。国产多模态大模型在视觉问答&#xff08;Visual Question Answering, VQA&#xff09;领域异军突起&#x…...

python安装openai库后如何快速接入taotoken多模型服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Python安装OpenAI库后如何快速接入Taotoken多模型服务 对于已经完成Python环境和OpenAI库安装的开发者&#xff0c;接入Taotoken平…...

国产LDO CN86L028实战:解决图像传感器电源噪声,兼容BL8062

1. 项目概述与核心需求解析最近在折腾一个老式录像机的修复与升级项目&#xff0c;目标很明确&#xff1a;提升其图像采集的稳定性。这台设备在运行中&#xff0c;画面时不时会出现条纹干扰&#xff0c;声音里也夹杂着微弱的底噪&#xff0c;尤其是在电源波动较大的环境下&…...