亿级流量的互联网项目如何快速构建?手把手教你构建思路

news2024/10/6 14:34:01

大流量的互联网项目

1.项目背景

索尔老师之前负责的一个项目,业务背景是这样的。城市的基础设施建设是每个城市和地区都会涉及到的,如何在基建工地中实现人性化管理,是当前项目的主要诉求。该项目要实现如下目标:

  • 工地工人的智慧考勤;

  • 考勤机通过面容做人脸识别就能打卡,工人不需要脱手套按指纹,甚至不需要卸下口罩;

  • 工地安全检测;

  • 检测某一个区域没有戴安全帽的工人,可以快速触发总控台,提醒管理员监管;

  • 工地机器的工作情况;

  • 统计工地机器是否正在工作及已经连续工作时长,用于检测机器是否在安全时间内使用。

从上述项目背景中我们就能看出,每一个功能的实现都需要硬件设备来实现:比如人脸识别考勤机来实现智慧打卡,带有人体识别功能的摄像头来捕捉没有戴安全帽的人员,传感器设备来统计机器是否正在工作。

除了工地项目外,还有另一种很有意思的应用场景,就是统计商场、超市的热门门店。大家肯定很好奇,这是怎么实现的?——对!也是通过摄像头。摄像头采集进入商场的人员,不用采集到脸,只需要根据人体的形态、衣服颜色、身高等特征值来标识一个主体。根据人体识别算法,统计哪些类型的人,在什么时间段,去了哪些门店。如果特征值足够匹配,甚至还能统计出性别和老幼。这个应用场景是不是非常有意思?其实,很多城市已经在用这一套系统。甚至还有更有意思的应用场景,物联网早已深入生活,而IOT的项目中的流量数据是非常大的。

索尔为什么要说这些呢?你有没有发现,其实这些都跟硬件设备有关。如果索尔老师所在的公司是一个硬件厂商,或者是一个小B中间商,索尔就需要知道我买的这些设备,是否都能够正常工作。如果能有一个类似于下面这样的数据大屏,那是不是更加完美呢?我们就是这么干的。

问题来了,设备的心跳数据该多久上报一次?上报时间间隔的不同会对整个系统造成怎样的影响?心跳数据怎么判断设备是否正常?会有多少的心跳数据?

2.设备上报心跳的时间间隔

设备的上报心跳动作其实是一个很简单的逻辑,就是上报将自己的设备key,和当前时间封装成一个http请求消息,发送给平台。

根据当时硬件部门的设定,不同设备的约定不同,每个设备大致会在2秒到5秒之间向平台发送一次心跳。

3.如何通过心跳计算出当前时间段设备是否正常

根据目前的情况,平台收到的设备的心跳信息可以通过这张表体现出来:

列名类型注释

DEVICE_KEY

varchar(32)

设备id

LAST_ACTIVE_TIME

datetime

最后活跃时间

这个表就是用来记录当前设备的最后活跃时间。那么问题来了,该怎么统计当前时间段的正常设备和异常设备?多久没有上报心跳的设备会被判定为异常设备呢?

心跳、服务发现。对!你也发现了,它们好像在描述同一件事情。在这里,索尔老师参考了微服务中注册中心对于服务剔除的方案。比如Nacos的服务健康检查机制:

Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15秒没有收到客户端心跳的实例会将它的健康属性置为false,如果某个实例超过30秒没有收到心跳,则直接剔除该实例。

索尔开启了一个每隔30秒定时任务,去设备心跳表中统计今日上报心跳的设备数量,具体的sql操作如下:

select count(device_key)  from tb_device 
where last_active_time >= '2023-10-10 00:00:00' and ast_active_time <= '2023-10-10 23:59:59'

针对于这条sql,有同学会问,为什么不直接用日期函数:

select count(device_key)  from tb_device 
where date(last_active_time) = '2023-10-10'

因为性能,使用函数会导致索引失效,关于SQL优化这一块的内容,大家可以在索尔老师的MySQL优化专题里进行学习。

我们可以将统计到的数据,维护在redis中。也就是说,redis中维护了今日正常设备的总数,这个数据每30秒更新一次。

4.并发量的产生

在上一章节中我们提到,任何一个设备,都会上报其心跳到平台,而且每个设备会每隔2到5秒左右上报一次心跳,我们试算下:

一台设备:每隔3秒上报一次;

三十万台设备:每隔3秒会上报30万次;

平台:每秒接收到10万次访问,每天将会收到将近百亿的消息。

可以推算出,一个平台基本上每秒都会收到大约10万次访问。这样的并发量不算大,但也不能说少,而且这样每秒10万的请求是持续的,这10万的请求每秒都会来,不间断的来,此时考验后端接口的时刻就到了。

5.业务如何处理

后端接口做到高性能、高可用设计,我们会在之后的专题去讲,这里先聊一下接口收到数据后,该如何处理。

很显然,接口收到设备上报的心跳数据后,要把数据落到数据库里。这就是具体业务要做的事,很简单,只要落到数据库里就可以。

待解决的核心业务逻辑

1.项目模块

整个项目分成了以下几个子项目:

  • 数据大屏前端项目

  • 数据大屏后端项目

  • 硬件后端项目

  • 硬件设备

  • Redis缓存服务器

  • MySQL关系型数据库

这些项目之间有着重要的联系,这样的联系可以总结为两点:一是数据大屏的后端为数据大屏的前端提供数据,二是硬件设备的后端供硬件设备访问实现数据交互。

那么问题来了,以第一点为例,后端和前端的数据交互方式是什么样?

2.前后端交互方式

“前端”的概念可以是多种终端的浏览器。部署在web服务器上的Java Web应用程序(即“后端”)提供了供http协议访问的web接口,也就是程序的调用入口。前端通过http协议访问后端的web接口,实现数据的交互。比如前端通过http协议访问后端获取网络资源的web接口,后端通过io流的方式获得网络资源并使用http协议返回给前端。这就是一个完整的前后端交互过程。

3.核心业务

  • 硬件如何访问到Java程序;

  • 硬件也可以通过http协议来访问到java的web接口;

  • 数据存到哪;

  • 打卡机等硬件生成员工的打卡数据,将数据发送给后端Java程序,Java程序将数据保存到MySQL数据库中。但这还不够,因为数据大屏的前端也需要获得数据,于是需要让数据大屏的后端去数据库获取数据;

  • 优化点在哪里。

很显然,设备的数据量非常大,势必给数据库造成过大的压力。优化点就在于如何让数据库更轻松一些。使用在处理能力上面非常优秀的Redis缓存数据库,解决数据库的压力。此时,与硬件对应的后端java程序将数据存入到redis中,数据大屏的后端程序从redis中取出数据,展示在数据大屏前端项目中。

核心业务代码

1.供硬件访问的后端Java程序

1.1 Controller

/**
 * @author Thor
 * @公众号 Java架构栈
 */
@RestController
@RequestMapping("/device")
public class DeviceController {

    @Autowired
    private DeviceService deviceService;

    @PostMapping("/mark")
    public ResultModel mark(@RequestBody Worker worker){
        if(Objects.isNull(worker) || Objects.isNull(worker.getId())){
            return ResultModel.error();
        }
        return deviceService.mark(worker);
    }
}

1.2 service

/**
 * @author Thor
 * @公众号 Java架构栈
 */
@Service
public class DeviceServiceImpl implements DeviceService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 拿到数据,存入到redis中:让打卡的员工总数+1
     * @param worker
     * @return
     */
    @Override
    public ResultModel mark(Worker worker) {
        //TODO 把打卡信息存入到数据库中
        //将redis中的打卡员工总数+1
        try {
            redisTemplate.opsForValue().increment("worker:total");
        } catch (Exception e) {
            e.printStackTrace();
            ResultModel.error();
        }
        return ResultModel.success();
    }
}

2.数据大屏前端访问后端接口

setData(){        
      const { workerTotal } = this    
      var vm = this;
      this.axios({
        method:'get',
        url:'http://localhost:9001/worker/total'
      }).then(function(response){
        var data = response.data;
        if(data.code==1000){
          console.log(data.data);
          vm.workerTotal.number[0] = data.data;
        }
      })    
      this.workerTotal.number[0] = vm.workerTotal.number[0];       
      this.workerTotal = { ...this.workerTotal }        
    }

前端使用VUE的axios来发送http请求,访问后端接口,并实时展示在DataV前端数据大屏框架的翻牌器组件中。

3.数据大屏后端提供数据的接口

3.1 Controller

/**
 * @author Thor
 * @公众号 Java架构栈
 */
@RestController
@RequestMapping("/worker")
@CrossOrigin
public class ViewController {

    @Autowired
    private ViewService viewService;

    @GetMapping("/total")
    public ResultModel getTotal(){
        return viewService.getTotal();
    }
}

3.2 service

/**
 * @author Thor
 * @公众号 Java架构栈
 */
@Service
public class ViewServiceImpl implements ViewService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 从redis中获得打卡总数的数据
     * @return
     */
    @Override
    public ResultModel<Integer> getTotal() {
        String result = redisTemplate.opsForValue().get("worker:total");
        return ResultModel.success(Integer.parseInt(result));
    }
}

前后端联调及测试

1.使用Postman测试后端硬件打卡接口

模拟使用id是1003,姓名是xiaoming的用户进行打卡,并返回打卡成功。

2.使用Postman测试后端获得打卡数据接口

访问后端获得打卡总数的接口,获得的打卡总数为18。

3.启动前端项目获得打卡总数

  • 在项目路径中使用cnpm install 安装vue项目需要的依赖;

  • 在项目路径中使用npm run serve 启动项目;

  • 获得页面数据。

以上内容就是索尔为大家分享的亿级流量互联网项目构建思路,不知道你现在是不是得到了一些启发呢?在我们的线下课程里,这个智慧工地的项目会有详细的讲解哦,欢迎你来学习。

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

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

相关文章

C语言实现http下载器(附代码)

C语言实现http的下载器。 例&#xff1a;做OTA升级功能时&#xff0c;我们能直接拿到的往往只是升级包的链接&#xff0c;需要我们自己去下载&#xff0c;这时候就需要用到http下载器。 这里分享一个&#xff1a; 功能&#xff1a; 1、支持chunked方式传输的下载 2、被重定…

Apollo开放平台8.0发布:多维升级“为开发者而生”

Apollo开放平台8.0重磅发布&#xff1a;多维升级“为开发者而生” Apollo开放平台迎来8.0版本&#xff0c;百度自动驾驶开放平台迈向易用性时代 百度Apollo EDU计划进展公布&#xff1a;已覆盖自动驾驶技术人才33.5万、700多所院校 Apollo Studio学习实践社区上线&#xff0c;新…

剑指offer----C语言版----第一天

目录 1. 数组中重复的数字Ⅰ 1.1 题目描述 1.2 思路一 1.3 思路二 1.4 思路三&#xff08;最优解&#xff09; 1. 数组中重复的数字Ⅰ 原题&#xff1a;剑指 Offer 03. 数组中重复的数字 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/shu-zu-zhong-…

Python语言快速入门上

目录 1、前言 2、变量和常量 1&#xff09;Python对象模型 2&#xff09;Python变量 二、运算符和表达式 【运算符和表达式】 【位运算符】 【逻辑运算符】 【成员运算符】 【身份运算符】 【常用内置函数】 【基本输入输出】 【模块导入与使用】 【Python代码编…

【PCB专题】Allegro导出3D文件

在PCB布局时,已经决定了大部分器件要放置的位置。如接口、主要的芯片、模块等。因为放置好器件后可能与结构干涉,如果没有发现,那么不得不在Layout的后期调整器件位置,增加工作量。所以前期布局基本确定后就需要导出3D文件给结构工程师,由他查看是否有器件与结构、螺丝孔等…

全志Tina Linux Display 开发指南支持百问网T113 D1-H哪吒DongshanPI-D1s V853-Pro等开发板

1 概述 让显示应用开发人员了解显示驱动的接口及使用流程&#xff0c;快速上手&#xff0c;进行开发&#xff1b;让新人接手工作时能快速地了解驱动接口&#xff0c;进行调试排查问题。sunxi 平台DE1.0/DE2.0。与显示相关的应用开发人员&#xff0c;及与显示相关的其他模块的开…

操作系统期末考试必会题库1——引言+用户界面

1.请简要描述操作系统的定义及其功能。 操作系统定义&#xff1a; 是计算机系统中的一个系统软件&#xff0c;是一些程序模块的集合 &#xff0c;它们管理和控制计算机系统中的软硬件资源&#xff0c;合理的组织计算机的工作流程&#xff0c;以便有效的利用这些资源为用户提供一…

Linux用户权限详解

为什么有人冲了钱就能享受至尊VIP待遇&#xff1f;为什么冲了黄钻、绿钻、紫钻就会享受一些特殊活动呢&#xff1f;我们起初都是一群普通用户&#xff0c;为什么有些人就能通过某些手段得到一些异于常人的服务呢&#xff1f;这其中的奥秘是什么呢&#xff1f;接下来带大家了解这…

【Vue】course_1

一、vue简介 Vue是一款用于构建用户界面的 JavaScript 框架。 它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。 无论是简单还是复杂的界面&#xff0c;Vue 都可以胜任。 二、vue3选项式…

ASEMI肖特基二极管MBR30100CT和MBR40200PT有什么区别

编辑-Z 别看ASEMI肖特基二极管MBR30100CT和MBR40200PT两种型号从名字上看很像&#xff0c;其实他们的参数和封装都是不一样的&#xff0c;具体MBR30100CT和MBR40200PT有什么区别呢&#xff1f; 肖特基二极管MBR30100CT参数&#xff1a; 型号&#xff1a;MBR30100CT 封装&…

[开源工具]使用Fiddler/Postman简单计算QPS[新手开箱可用]

使用Fiddler/Postman简单计算QPS1.什么是QPS?2.怎么计算QPS?3.如何使用Fiddler/Postman得到一个API接口的QPS?3.1Fiddler使用3.2Postman使用4.如何得到本机的核心数?5.根据公式计算QPS?6.扩展计算单机可支撑PV(理论值)?1.什么是QPS? qps即每秒查询率&#xff0c;是对一…

Postfix + Extmail 企业邮件服务器搭建

ExtMail套件用于提供从浏览器中登录、使用邮件系统的Web操作界面&#xff0c;而Extman套件用于提供从浏览器中管理邮件系统的Web操作界面。它以GPL版权释出&#xff0c;设计初衷是希望设计一个适应当前高速发展的IT应用环境&#xff0c;满足用户多变的需求&#xff0c;能快速进…

数据预处理和特征工程-sklearn

数据挖掘的五大流程&#xff1a; 获取数据数据预处理 数据预处理是从数据中检测&#xff0c;纠正或删除损坏&#xff0c;不准确或不适用于模型的记录的过程。 数据预处理的目的&#xff1a;让数据适应模型&#xff0c;匹配模型的需求特征工程 特征工程是将原始数据转换为更能代…

NLP 中文智能纠错 API 数据接口

NLP 中文智能纠错 API 数据接口 专注于中文语句智能纠错&#xff0c;基于 NLP&#xff0c;多模型参与纠错。 1. 产品功能 秒级 NLP 智能纠错性能&#xff1b;NLP 加载多个模型进行纠错处理&#xff1b;返回纠正字符以及对应位置索引&#xff1b;底层模型以及语料库持续更新集…

正大国际期货:五十句期货投资理念

1.许多期货投资人交易时没有计划。交易前&#xff0c;他们既不设定风险限度&#xff0c;也不设定盈利目标。即使是制定了计划&#xff0c;他们总是“半路出家”&#xff0c;并不坚持既定的计划&#xff0c;尤其是在出现亏损的情况下。结果往往是过量操作&#xff0c;把自己逼在…

Android 操作系统简介

Android 操作系统简介1. 起源2. 操作系统市场占有率3. Android 系统架构3.1 Linux Kernel3.2 Hardware Abstraction Layer (HAL)3.3 运行时 系统库3.3.1 Android Runtime3.3.1 Native C/C Libraries3.4 Java API Framework3.5 System Apps1. 起源 安卓&#xff08;Android&…

程序员年底如何升职加薪?这份涨薪指南来了!

年底了&#xff0c;这个时间节点对于各个公司来说都很重要。 今年大家也知道情况&#xff0c;互联网整体行情都不太好&#xff0c;国外也不好过&#xff0c;硅谷裁员大刀阔斧&#xff0c;实实在在的 感受到了寒意。 能顺利熬到年底的程序员&#xff0c;现在就会关心“公司会普调…

一分钟搞定Netty 三大组件,如果搞不定,再看3遍

1. 三大组件简介 Channel 与 Buffer Java NIO 系统的核心在于&#xff1a;通道 (Channel) 和缓冲区 (Buffer)。通道表示打开到 IO 设备 (例如&#xff1a;文件、套接字) 的连接。若需要使用 NIO 系统&#xff0c;需要获取用于连接 IO 设备的通道 以及用于容纳数据的缓冲区。然…

黑客使用虚假 DDoS 保护页面分发恶意软件

WordPress 网站被黑客入侵后显示欺诈性 Cloudflare DDoS 保护页面&#xff0c;这些页面被用于分发恶意软件&#xff08;例如 NetSupport RAT 和 Raccoon Stealer&#xff09;。 “最近针对 WordPress 网站的 JavaScript 注入激增&#xff0c;通过弹出虚假的 DDoS 阻止提示&…

DaVinci:跟踪器 - 窗口

调色页面&#xff1a;跟踪器Color&#xff1a;Tracker跟踪器 - 窗口 Tracker - Window&#xff0c;是 DaVinci Resolve 提供的一款强大的跟踪工具。可以利用窗口调板所设置的窗口区域&#xff0c;通过自动分析之后&#xff0c;在此区域内产生许多如云状分布的特征点&#xff08…