Java 工程师转型大数据的优势——别小看自己!

news2024/9/22 4:10:12

时间:2024年09月05日

作者:小蒋聊技术

邮箱:wei_wei10@163.com

微信:wei_wei10

音频地址: https://xima.tv/1_U3suSJ?_sonic=0

希望大家帮个忙!如果大家有工作机会,希望帮小蒋推荐一下,小蒋希望遇到一个认真做事的团队,一起努力。需要简历可以加我微信。

大家好,欢迎来到小蒋聊技术,小蒋准备和大家一起聊聊技术的那些事。

今天小蒋准备和大家一起聊的这个技术就厉害了!那就是高并发多线程。

哎呀,不得不说,咱们 Java 工程师在企业级开发上可是一路拼杀过来的,早就见过大世面了!面对 多线程、并发处理,那是轻车熟路。所以你别以为转型大数据是啥大挑战,反而咱们在高并发任务调度 方面可是得心应手。

今天,我就带你看看,在大数据场景下,如何用上咱们熟悉的 ExecutorServiceForkJoinPool,顺便聊聊怎么让它们和 微服务架构 搭上关系,保证系统高效运行。

场景设定:电商大促,订单处理与推荐系统要崩了?

假设你现在是一个电商平台的“幕后大佬”,咱们平台刚好赶上 双11,订单量成千上万地涌进来,用户买买买根本停不下来。光是处理这些订单就让你感觉脑袋发懵。而这还不算完,你的推荐系统还得根据用户的实时行为来生成个性化推荐,生怕用户买得不够多。

问题是,订单处理要快,推荐系统也要实时,这可咋整?


方案一:ExecutorService 来帮你搞定订单并发处理

说到订单处理,它有个很让人头疼的特点——I/O 密集型任务。你想啊,每个订单都得查库存生成订单调支付接口,每一步都得等着系统慢慢处理。订单一多,压力山大啊!

这时候你得赶紧想办法“多线程并发”,让订单服务嗖嗖地并行处理。这时候,ExecutorService 就是咱们的好帮手,它可以通过线程池来管理这些并发任务,别说一堆订单,几十万个订单同时来,ExecutorService 也能处理得游刃有余。

微服务加持:每个订单服务自己搞定自己

先别急着用多线程,咱们得先用 微服务架构。啥意思?就是把咱们的订单处理拆成一个独立的服务,专门处理订单请求。每个订单服务有自己的线程池,处理一批订单。万一流量爆了,没事,多开几个订单服务实例就行,系统压力自然分散了。

代码时间:ExecutorService 来处理并发订单

咱们举个例子,代码来解释最直接:

// 订单服务:创建一个固定大小的线程池

ExecutorService executorService = Executors.newFixedThreadPool(20);



public void handleOrder(Order order) {

    // 将订单处理任务提交到线程池

    executorService.submit(() -> processOrder(order));

}



private void processOrder(Order order) {

    try {

        // 1. 检查库存

        if (!checkInventory(order.getProductId(), order.getQuantity())) {

            throw new RuntimeException("库存不足");

        }



        // 2. 创建订单

        orderRepository.save(order);



        // 3. 调用支付服务

        PaymentResult result = paymentService.processPayment(order);



        // 4. 根据支付结果更新订单状态

        if (result.isSuccess()) {

            order.setStatus("PAID");

        } else {

            order.setStatus("PAYMENT_FAILED");

        }

        orderRepository.save(order);



    } catch (Exception e) {

        order.setStatus("FAILED");

        orderRepository.save(order);

    }

}

咋样,是不是简单又直观?ExecutorService 把订单处理任务一股脑交给线程池,20个线程并行处理订单,谁跑得快谁先完成,不卡队也不排队。

微服务配合:

别忘了,我们用的可是 微服务架构!你可以让订单服务跑在多个实例上,每个实例自己管理自己的线程池。当订单量大到你怀疑人生时,微服务架构还能横向扩展,让系统扛住任何风浪。


方案二:ForkJoinPool 解决推荐系统的计算压力

好了,订单处理搞定了,接下来就是推荐系统的重头戏了。推荐系统那可是 计算密集型任务,用户的点击、浏览、购买行为,都是成吨的数据。你得快速分析这些数据,生成个性化推荐,给用户喂点“合胃口”的商品。

如果你还想用顺序处理,早晚有一天你得抱着服务器哭。推荐系统可是讲究快和准,ForkJoinPool 出场的时候到了!

ForkJoinPool 的秘密武器:任务拆分,CPU 全开

ForkJoinPool 的厉害之处在于,它不但能并行处理,还能把任务拆成小块。你交给它一堆用户数据,它会自动帮你拆成小任务,分配给多个线程并行处理。简单点说,就是它帮你把复杂的计算任务搞定得妥妥的,CPU 能用多少用多少。

代码时间:ForkJoinPool 并行推荐计算

直接上代码,你会发现 ForkJoinPool 处理起来也是小菜一碟:

import java.util.concurrent.RecursiveTask;

import java.util.concurrent.ForkJoinPool;



// 推荐计算任务

class RecommendationTask extends RecursiveTask<List<Recommendation>> {

    private List<UserBehavior> behaviors;

    private static final int THRESHOLD = 1000;  // 任务拆分阈值



    public RecommendationTask(List<UserBehavior> behaviors) {

        this.behaviors = behaviors;

    }



    @Override

    protected List<Recommendation> compute() {

        if (behaviors.size() <= THRESHOLD) {

            return calculateRecommendations(behaviors); // 任务足够小,直接计算

        } else {

            int middle = behaviors.size() / 2;

            RecommendationTask task1 = new RecommendationTask(behaviors.subList(0, middle));

            RecommendationTask task2 = new RecommendationTask(behaviors.subList(middle, behaviors.size()));

            task1.fork();  // 异步执行第一个任务

            List<Recommendation> result2 = task2.compute();  // 同步执行第二个任务

            List<Recommendation> result1 = task1.join();  // 等待第一个任务完成

            result1.addAll(result2);

            return result1;

        }

    }



    private List<Recommendation> calculateRecommendations(List<UserBehavior> behaviors) {

        // 模拟生成推荐结果

        List<Recommendation> recommendations = new ArrayList<>();

        for (UserBehavior behavior : behaviors) {

            recommendations.add(new Recommendation(behavior.getUserId(), "推荐商品:" + behavior.getProductId()));

        }

        return recommendations;

    }

}



// 使用 ForkJoinPool 进行推荐计算

ForkJoinPool forkJoinPool = new ForkJoinPool();

RecommendationTask task = new RecommendationTask(userBehaviorList);

List<Recommendation> recommendations = forkJoinPool.invoke(task);

推荐计算的压力一下子分散开了,系统不卡顿,推荐结果嗖嗖的就生成出来。ForkJoinPool 可是用上了“任务拆分”加上“工作窃取”的双重神器,所有 CPU 核心都在全速工作,用户根本感觉不到等待。

微服务配合:

推荐系统也是一个独立的微服务,搞定一件事:推荐!你可以动态增加推荐服务的实例,根据用户量的增加来扩展计算能力。ForkJoinPool 是为 CPU 密集型任务而生的,配合微服务架构,系统性能一飞冲天。


总结:ExecutorService 和 ForkJoinPool 在微服务架构下的完美搭档

到这里,咱们总结一下:

  • ExecutorService:它是处理 I/O 密集型任务 的利器,适合订单处理、库存检查、支付调用这些场景。微服务架构下,多实例横向扩展,让你订单服务“人手多了不慌”。
  • ForkJoinPool:专攻 计算密集型任务,像推荐系统这种复杂的计算任务,它通过任务拆分和多核并行处理,速度飞快。加上微服务架构的灵活扩展,推荐系统就不怕用户多了!

所以呢,Java 工程师在大数据领域其实很吃香。你们的并发编程能力正是大数据系统的刚需。学会把 ExecutorServiceForkJoinPool 结合 微服务架构,你就可以轻松应对复杂的大数据场景,顺利转型!

好了,今天就分享到这儿,下次再见!别忘了继续关注“小蒋了解技术”频道,更多技术干货等你来拿!

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

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

相关文章

2024国赛数学建模A题思路模型

完整的思路模型请查看文末名片

机器学习:opencv图像识别--模版匹配

目录 一、模版匹配的核心概念 1.图片模板匹配是一种用于在图像中查找特定模式或对象的技术。 2.模板图像 3.目标图像 4.滑动窗口 5.相似度度量 6.匹配位置 二、模版匹配的步骤 1.准备图像&#xff1a; 2.预处理&#xff1a; 3.匹配&#xff1a; 4.定位最佳匹配&…

【MySQL】初识MySQL—MySQL是啥,以及如何简单操作???

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解关于MySQL的简单使用和注意事项&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/wwaqe &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 目…

2024数学建模国赛题目A-E题

2024数学建模国赛题目A-E题已经发布 各个赛题题目如下 A题 板凳龙 闹元宵 B题 生产过程中的决策问题 C题 农作物的种植策略 D题 反潜航空深弹命中概率问题 E题 交通流量管控 Csdn在文末&#xff0c;关注云顶数模公众号&#xff0c;或者点击下方名片。

2024年高教社杯数学建模国赛赛题浅析——助攻快速选题

一图流——一张图读懂国赛 总体概述&#xff1a; A题偏几何与运动学模型&#xff0c;适合有几何与物理背景的队伍&#xff0c;数据处理复杂性中等。 B题侧重统计和优化&#xff0c;适合有运筹学和经济学背景的队伍&#xff0c;数据处理较为直接但涉及多步骤的决策优化。 C题…

新手c语言讲解及题目分享(十六)--文件系统专项练习

在我刚开始学习c语言的时候就跳过了这一章节&#xff0c;但在后面慢慢发现这一章节还是比较重要的,如果你报考了计算机二级c语言的话&#xff0c;你应该可以看到后面的三个大题有时会涉及到这章。所以说这章还是非常重要的。 目录 前言 一.打开文件 1.Fopen( )函数返回值 2&…

Keil发现Error: C9555E: Failed to check out a license

遇到这样的问题 解决办法&#xff1a; 换成这个版本 然后重新用keygen生成license

如何理解进程和线程之间的关系

目录 前言 一、进程和线程的关系 1、引入线程的原因 2、线程的特点 3、线程和进程的关系 二、如何在进程中创建线程 1、创建线程的函数 2、举例使用&#xff1a; 三、线程间的同步互斥机制 1、什么是同步互斥机制 2、如何在线程中使用同步互斥机制 3、实际举例 总结 前言 …

为什么要有RPC

​ 1. RPC&#xff08;Remote Procedure Call&#xff09; 定义&#xff1a; RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种允许程序在不同的地址空间&#xff08;通常是在网络上的不同机器&#xff09;之间调用函数或方法的机制。它使得…

代码随想录算法训练营Day03 | 链表理论基础、203.移除链表元素 、707.设计链表、206.反转链表

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 链表理论基础203.移除链表元素思路与重点 707.设计链表思路与重点 206.反转链表思路与重点 链表理论基础 C/C的定义链表节点方式&#xff1a; // 单链表 struct L…

vue part 8

浏览器本地存储 application&#xff0c; local storage中 js方法肯定会用很多呀&#xff0c;只是不直接操作dom了但是对对象和数组进行操作还是原先的方法&#xff0c;jq的话想用引入就可以了。我是直接放弃jq了&#xff0c;在框架中用jq包不好 sessionStorage.HTML <!…

Git+word记笔记

程序员记笔记主要同步很重要&#xff0c;我这个方法只支持个人笔记&#xff0c;如果团队还是用企业微信开个企业会员比较方便。为什么用word&#xff0c;因为可以镶嵌代码和文档&#xff0c;不仅仅是文字&#xff0c;兼容性强 语雀&#xff0c;云笔记这些对于上传的word都是有…

AI大模型编写多线程并发框架(六十五):发布和应用

系列文章目录 文章目录 系列文章目录前言一、项目背景二、第十三轮对话-优化传参三、第十四轮对话-释放资源四、完善所有单元测试五、验证通过六、发布七、参考文章 前言 在这个充满技术创新的时代&#xff0c;AI大模型正成为开发者们的新宠。它们可以帮助我们完成从简单的问答…

IA——网络操作设备VRP简介

一&#xff0c;VRP简介 二&#xff0c;网络设备的管理 &#xff08;1&#xff09;console口&#xff1a; &#xff08;2&#xff09;talnet: &#xff08;3&#xff09;SSH: 安全的远程登陆 &#xff08;4&#xff09;通过WEB页面登录&#xff1a; 三&#xff0c;命令行常见…

TikTok养号一般养几天?账号起步方法

TikTok养号是一个关键的步骤&#xff0c;它可以帮助新账号快速积累粉丝和观众&#xff0c;增加视频的曝光和互动率&#xff0c;从而提升账号的影响力和可见性。但是养号也并不是简单的登录账号、互动点赞&#xff0c;而是从底层设备到分发频率都需要讲究方法&#xff0c;否则号…

linux下c语言中的单向列表,双向链表,内核双向列表,及适用场景

1. 单向链表&#xff08;Singly Linked List&#xff09; 1.1 定义与结构 单向链表是链式存储结构中最简单的一种。它的每个节点包含两个部分&#xff1a; - 数据域&#xff1a;存储数据元素 - 指针域&#xff1a;存储指向下一个节点的指针 在单向链表中&#xff0c;节点通过…

OpenHarmony实战开发:@Watch装饰器:状态变量更改通知

往期鸿蒙全套实战精彩文章必看内容&#xff1a; 鸿蒙开发核心知识点&#xff0c;看这篇文章就够了 最新版&#xff01;鸿蒙HarmonyOS Next应用开发实战学习路线 鸿蒙HarmonyOS NEXT开发技术最全学习路线指南 鸿蒙应用开发实战项目&#xff0c;看这一篇文章就够了&#xff08…

为什么要做智慧厕所,智慧公厕的建设意义有哪些?@卓振思众

智慧厕所是利用物联网、大数据、人工智能等技术&#xff0c;对传统厕所进行智能化升级改造后的新型厕所。它具备环境监测与调控、厕位引导、资源管理、安全管理、数据分析与管理平台等功能和特点。卓振思众是智慧厕所源头厂家&#xff0c;建设智慧厕所主要有以下几个重要原因&a…

【python因果推断库7】使用 pymc 模型的工具变量建模 (IV)2

目录 与普通最小二乘法 (OLS) 的比较 应用理论&#xff1a;政治制度与GDP 拟合模型&#xff1a;贝叶斯方法 多变量结果和相关性度量 结论 与普通最小二乘法 (OLS) 的比较 simple_ols_reg sk_lin_reg().fit(X.reshape(-1, 1), y)print("Intercept:", simple_ols_…

V90总线伺服报800F错误

1、博途PLC工艺对象位置轴轴控功能块 博途PLC工艺对象位置轴轴控功能块(完整SCL代码)-CSDN博客文章浏览阅读423次。S7-1200PLC脉冲轴位置轴位置控制功能块S7-1200PLC脉冲轴位置轴位置控制功能块优化(完整SCL源代码)_s71200 脉冲轴-CSDN博客文章浏览阅读341次。该博客详细介绍了…