07 2023 档案
摘要:流式计算:是可以源源不断的产生数据,源源不断的接收数据,没有边界。 应用场景: 日志分析:网站的用户访问日志进行实时的分析,计算访问量,用户画像,留存率等等,实时的进行数据分析,帮助企业进行决策 大屏看板统计:可以实时的查看网站注册数量,订单数量,购买数量,金额等。 公交实时数据:可以随时更新公交车
阅读全文
摘要:(1)在xxl-job-admin中新建执行器和任务 新建执行器:leadnews-hot-article-executor 新建任务:路由策略为轮询,Cron表达式:0 0 2 * * ? 每天凌晨2点 (2)leadnews-article中集成xxl-job 导入依赖、config、修改nac
阅读全文
摘要:需求:为每个频道缓存热度较高的30条文章优先展示 断文章热度较高的标准是什么?文章:阅读,点赞,评论,收藏 package com.heima.article.service.impl; import com.alibaba.fastjson.JSON; import com.heima.apis.
阅读全文
摘要:从数据库直接按照发布时间倒叙查询 问题1:访问量较大,直接查询数据库,压力较大 问题2:新发布的文章会展示在前面,并不是热点文章 解决方案:把热点数据存入redis进行展示:点赞数量,评论数量,阅读数量,收藏数量 定时计算文章热度 实时计算文章热度 一、定时计算 根据文章的行为(点赞、评论、阅读、收
阅读全文
摘要:一、点赞/取消点赞、不喜欢/取消不喜欢、阅读次数 数据都存在redis中的hashmap中,以(key,field,value)的形式,如key是behavior_like + articleId,field是userId,value存dto。 点赞/取消点赞 package com.heima.b
阅读全文
摘要:用户行为: 1、用户行为数据的记录包括了关注、点赞、不喜欢、收藏、阅读等行为 黑马头条项目整个项目开发涉及web展示和大数据分析来给用户推荐文章,如何找出哪些文章是热点文章进行针对性的推荐呢?这个时候需要进行大数据分析的准备工作,埋点。 所谓“埋点”,是数据采集领域(尤其是用户行为数据采集领域)的术
阅读全文
摘要:需求: 自媒体文章如果没有自动审核成功,而是到了人工审核(自媒体文章状态为3),需要在admin端人工处理文章的审核 平台管理员可以查看待人工审核的文章信息,如果存在违规内容则驳回(状态改为2,文章审核失败) 平台管理员可以查看待人工审核的文章信息,如果不存在违规,则需要创建app端的文章信息,并更
阅读全文
摘要:需求: 在app端的个人中心用户可以实名认证,需要材料为:姓名、身份证号、身份证正面照、身份证反面照、手持照片、活体照片(通过**微笑、眨眼、张 嘴、摇头、点头**等组合动作,确保操作的为真实活体人脸。),当用户提交审核后就到了后端让运营管理人员进行审核。 平台运营端查看用户认证信息,进行审核,其中
阅读全文
摘要:敏感词——增删改查 package com.heima.wemedia.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybati
阅读全文
摘要:对频道进行增删改查,在admin网关中增加leadnews-media路由 package com.heima.wemedia.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
阅读全文
摘要:一、网关搭建 (1)如果是登录请求则放行/login (2)其它请求则获取token判断是否存在、是否过期 (3)token不存在或者过期则返回未授权结果。未过期则从token中获取用户信息存入header然后放行 package com.heima.admin.gateway.filter; im
阅读全文
摘要:需求分析:根据用户输入的关键字展示联想词 搜索词-数据来源 通常是网上搜索频率比较高的一些词,通常在企业中有两部分来源: 第一:自己维护搜索词 通过分析用户搜索频率较高的词,按照排名作为搜索词 第二:第三方获取 关键词规划师(百度)、5118、爱站网 package com.heima.search
阅读全文
摘要:/** * 删除历史记录 * * @param dto * @return */ @Override public ResponseResult delUserSearch(HistorySearchDto dto) { //1、检查参数 if(dto.getId() == null){ retur
阅读全文
摘要:/** * 查询搜索历史 * * @return */ @Override public ResponseResult findUserSearch() { //获取当前用户 ApUser user = AppThreadLocalUtil.getUser(); if(user == null){
阅读全文
摘要:一、实现思路 输入关键字——》搜索——异步请求——》记录关键字 【异步请求保存关键字,让用户快速看到搜索结果,等待时间更短】 保存——>查询搜索记录——存在——更新到最新时间 不存在——搜索记录的数量是否超过10——没超过则直接保存,超过则替换最后一条数据即时间最久 二、实现步骤 1、搜索微服务集成
阅读全文
摘要:一、需求说明 展示用户的搜索记录10条,按照搜索关键词的时间倒序 可以删除搜索记录 保存历史记录,保存10条,多余的则删除最久的历史记录 二、数据存储说明 用户的搜索记录,需要给每一个用户都保存一份,数据量较大,要求加载速度快,通常这样的数据存储到mongodb更合适,不建议直接存储到关系型数据库中
阅读全文
摘要:文章微服务异步调用生成静态文件,上传到minIO之后发送消息到MQ,因为创建索引需要staticurl。 注:倘若创建索引失败,追踪es日志,同样可能是因为磁盘使用率超出阈值,es变为只读,无法添加,因此也无法查询到 package com.heima.article.service.impl; i
阅读全文
摘要:文章搜索:用户在app端输入关键字,搜索文章。 一、ElastcSearch环境搭建 (1)拉取ElasticSearch镜像 docker pull elasticsearch:7.4.0 (2)创建ElasticSearch容器 docker run -id --name elasticsear
阅读全文
摘要:需求分析: 已发表且已下架的文章可以上架 已发表且已上架的文章可以下架 自媒体端点击上架下架按钮: 上架下架——>根据id查询文章——>文章是否存在:否结束,是——文章是否发布——>否结束,是——修改自媒体文章状态enable app移动端:自媒体端发送请求到kafka,参数文章的articleId
阅读全文
摘要:目前springboot整合后的kafka,因为序列化器是StringSerializer,这个时候如果需要传递对象可以有两种方式 方式一:可以自定义序列化器,对象类型众多,这种方式通用性不强。 方式二:可以把要传递的对象进行转json字符串,接收消息后再转为对象即可,本项目采用这种方式 JSON.
阅读全文
摘要:1、导入spring-kafka依赖信息 <!-- kafkfa --> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <exclusions> <exc
阅读全文
摘要:一、消费者组 消费者组(Consumer Group) :指的就是由一个或多个消费者组成的群体 一个发布在Topic上消息被分发给此消费者组中的一个消费者 所有的消费者都在一个组中,那么这就变成了queue模型【消息队列,只有一个用户能接收到消息】 所有的消费者都在不同的组中,那么就完全变成了发布-
阅读全文
摘要:一、消息确认机制,生产者发送消息: acks = 0 :发送完不等任何服务器响应就认为发送成功 acks = 1:收到一个服务器响应就认为发送成功 acks = all:所有节点都收到,才会收到响应,发送成功。 二、retries(设置重试次数) //设置重试次数 prop.put(Producer
阅读全文
摘要:一、发送类型 同步发送:使用send()方法发送,它会返回一个Future对象,调用get()方法进行等待,就可以知道消息是否发送成功 //发送消息 try { RecordMetadata recordMetadata = producer.send(record).get(); System.o
阅读全文
摘要:一、集群: Kafka 的服务器端由被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成 这样如果集群中某一台机器宕机,其他机器上的 Broker 也依然能够对外提供服务。这其实就是 Kafka 提供高可用的手段之一 二、备份机制 Kafka 中消息的备份又叫做
阅读全文
摘要:Kafka 中的分区机制指的是将每个主题划分成多个分区(Partition) 可以处理更多的消息,不受单台服务器的限制,可以不受限的处理更多的数据 每一个分区都是一个顺序的、不可变的消息队列, 并且可以持续的添加。分区中的消息都被分了一个序列号,称之为偏移量(offset),在每个分区中此偏移量都是
阅读全文
摘要:生产者发送消息,多个消费者只能有一个消费者接收到消息 生产者发送消息,多个消费者都可以接收到消息 一、生产者发送消息 (1)导入kafka客户端依赖 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients<
阅读全文
摘要:先安装zookeeper: Kafka对于zookeeper是强依赖,保存kafka相关的节点数据,所以安装Kafka之前必须先安装zookeeper Docker安装zookeeper: 拉取镜像:docker pull zookeeper:3.4.14 创建容器:docker run -d --
阅读全文
摘要:消息中间件对比: 选择建议: Kafka:是一个分布式流媒体平台 类似于消息队列或企业消息传递系统。 kafka官网:http://kafka.apache.org/ (1)producer:发布消息的对象称之为主题生产者(Kafka topic producer) (2)topic:Kafka将消
阅读全文
摘要:自媒体文章上下架:让app移动端用户能否查看到。 需求分析: 自媒体微服务——feign远程调用——》文章微服务 耦合性较高 采用MQ:自媒体微服务——》MQ《——文章微服务 系统解耦 点赞量较高:MQ流量削峰 消息中间件Kafka Kafka基本概念 Kafka入门案例 Kafka高可用设计 、
阅读全文
摘要:文章审核:按照固定的频率拉取任务,每秒钟拉取一次,再审核文章。 @Autowired private WmNewsAutoScanService wmNewsAutoScanService; /** * 消费任务【拉取任务】 */ @Scheduled(fixedRate = 1000) @Over
阅读全文
摘要:文章发布——添加任务——》schedule《——拉取任务——文章审核 当前时间或未来时间都由该服务处理 1、添加任务 @Autowired private IScheduleClient scheduleClient; /** * 添加任务到延时队列中 * * @param id 自媒体文章id *
阅读全文
摘要:延迟队列微服务: redis:list-执行时间<=当前时间 zset-当前时间<执行时间<当前时间+5分钟 添加任务:【以防任务数量过大在,一旦服务器挂掉,内存所有的数据都消失了,所以要做数据持久化】添加任务到数据库、符合条件的任务添加到redis【list,zset】 取消任务:删除数据库任务信
阅读全文
摘要:把数据库任务定时存储到redis:当前时间 < 执行时间 <= 预设时间(当前时间+5分钟) 预加载:如果任务量特别大,一次将数据库所有future任务全都加载到redis内存,可能会导致阻塞。 1.清理缓存中的数据 2.查询小于未来5分钟的所有任务 3.新增任务到redis /** * 数据库任务
阅读全文
摘要:问题描述: 启动两台heima-leadnews-schedule服务,每台服务都会去执行refresh定时任务方法 分布式锁:控制分布式系统有序的去对共享资源进行操作,通过互斥来保证数据的一致性。 分布式锁的解决方案: sexnx (SET if Not eXists) 命令在指定的 key 不存
阅读全文
摘要:未来数据定时刷新——实现步骤: 定时任务/每分钟————》未来数据的keys————》按照分值查询zset,判断数据是否到期——到期》同步到Redis中的list 1、如何获取zset中所有的key? keys 模糊匹配,future。效率低 SCNA命令:SCAN 命令是一个基于游标的迭代器,SC
阅读全文
摘要:实现思路: 消费任务————————》从redis中的list中pop数据——————》修改数据库的任务 参数:任务的类型和优先级 pop:取出数据并删除 删除任务&修改任务日志 /** * 按照任务类型和优先级拉取任务 * @param type * @param priority * @retu
阅读全文
摘要:场景:第三接口网络不通,使用延迟任务进行重试,当达到阈值以后,取消任务。 taskId——》删除任务——》更新日志状态——》删除redis中的数据 1、根据taskid删除任务,修改任务日志状态为 2(取消) 2、删除redis中对应的任务数据,包括list和zset /** * 取消任务 * @p
阅读全文
摘要:1、添加任务到数据库 2、判断当前任务的执行时间 执行时间<=当前时间:存储到 list(当前消费队列) 当前时间<执行时间<=预设时间(预设时间=当前时间+5分钟):存储zset (未来数据队列),定时刷新从zset中将任务存入list。 一、添加任务 1、创建task类,用于接收添加任务的参数
阅读全文
摘要:1、在项目导入redis相关依赖 <!--spring data redis & cache--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis<
阅读全文
摘要:一、heima-leadnews-schedule是一个通用的服务,单独创建模块来管理任何类型的延迟任务 二、在service下搭建heima-leadnes-schedule微服务模块,用以对其它服务提供延迟任务处理服务。 MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器;
阅读全文
摘要:实现思路: 发布时间:立即发布、未来要发布 list存立即发布,redis中的list是双向链表,方便添加查找性能较高。 zset可以去重、排序,存储未来要发布的。 为什么要把任务存储到数据库中? 延迟任务是一个通用的服务,任何有延迟需求的任务都可以调用该服务,内存数据库的存储是有限的,需要考虑数据
阅读全文
摘要:定时任务:有固定周期的,有明确的触发时间 延迟任务:没有固定的开始时间,它常常是由一个事件触发的,而在这个事件触发之后的一段时间内触发另一个事件,任务可以立即执行,也可以延迟 场景一:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单;如果期间下单成功,任务取消 场景二:接口对接出现网络问
阅读全文
摘要:文章发布——异步调用——>文章审核 问题: 不管文章的发布时间是什么时间段都会立马进行审核,然后生成app端相关的数据 此刻:立即发布文章 未来时间:按时发布文章 文章发布——》延迟任务服务《——文章审核
阅读全文
摘要:一、自媒体微服务 —— 远程调用——> 文章微服务 倘若有一个微服务报错,另一个微服务不知道,无法保证事务的一致性。 作业:使用seata来解决审核过程中的分布式事务的问题 二、倘若文章发布是一个未来时间,该如何按照精确时间发布? 如1月1号提交,但是设定发布时间是1月5号。
阅读全文
摘要:文章端创建app相关文章时,生成文章详情静态页上传到MinIO中 审核文章——feign远程——>修改或创建app相关数据——异步——>生成静态文件 文章微服务 自媒体用户发布文章后 审核成功后将 异步 feign 远程调用文章微服务,在文章微服务中有个方法将通过审核的文章保存或修改文章,以供移动端
阅读全文
摘要:1、在heima-leadnews-common中创建工具类,封装一下tess4j package com.heima.common.tess4j; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.Tess
阅读全文
摘要:文章中包含的图片要识别文字,过滤掉图片文字的敏感词 图片文字识别: OCR (Optical Character Recognition,光学字符识别):是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程 Tesse
阅读全文
摘要:①:创建敏感词表,导入资料中wm_sensitive到leadnews_wemedia库中 ②:拷贝对应的wm_sensitive的mapper到项目中 ③:在文章审核的代码中添加自管理敏感词审核 @Autowired private WmSensitiveMapper wmSensitiveMap
阅读全文
摘要:问题:文章审核不能过滤一些敏感词:私人侦探、针孔摄象、信用卡提现、广告代理、刻章办、出售答案、小额贷款… 需要完成的功能:自己维护一套敏感词,在文章审核的时候,需要验证文章是否包含这些敏感词 方案: 1、数据库模糊查询 效率低 2、String.index("")查找 数据库量大的话也是比较慢 3、
阅读全文
摘要:测试:文章发布——文章审核功能是否正常 自媒体前端发布一篇正常的文章:审核成功后,app端的article相关数据是否可以正常保存,自媒体文章状态和app端文章id是否回显。 [遇到的问题:由于自媒体用户发布文章中的写操作写入wmnews表要等整个方法结束后才会提交到数据库,倘若事务提交后在在磁盘上
阅读全文
摘要:同步:就是在发出一个调用时,在没有得到结果之前, 该调用就不返回(实时处理) 异步:调用在发出之后,这个调用就直接返回了,没有返回结果(分时处理) 发布文章——》异步调用——》审核文章 异步线程的方式审核文章 SpringBoot集成异步线程调用: ①:在自动审核的方法上加上@Async注解(标明要
阅读全文