CAT源码分析5 - 服务端消息接收
深度解析Cat源码系列专栏点击访问
文章目录
- CAT源码分析5 - 服务端消息接收
- 1. TcpSocketReceiver初始化
- 2. MessageDecoder消息解码器
- 3. MessageConsumer消费
- 3.1 消费机制
- 3.2 Period任务管理
- 3.2.1 RealtimeConsumer
- 3.2.2 PeriodManager
- 周期策略分析
- 3.3 Period&PeriodTask
- 3.4 RealtimeConsumer
CAT源码分析5 - 服务端消息接收
1. TcpSocketReceiver初始化
在CAT服务端启动初始化过程中,CatHomeModule在初始化时,会通过setUp()和execute()两个方法实现对消息接收器的初始化。
- 通过setUp方法完成对Netty客户端网络通信的初始化
- execute方法中有其他功能的初始化逻辑,包括对消息消费者的初始化
整体的初始化逻辑如下图
com.dianping.cat.CatHomeModule#setup 设置方法如下
- 通过Peluxs容器实例化TcpSocketReceiver,并执行init初始化
- 对进程设置销毁监听
@Override
protected void setup(ModuleContext ctx) throws Exception {final TcpSocketReceiver messageReceiver = ctx.lookup(TcpSocketReceiver.class);messageReceiver.init();// 销毁监听Runtime.getRuntime().addShutdownHook(new Thread() {@Overridepublic void run() {messageReceiver.destory();}});
}
com.dianping.cat.analysis.TcpSocketReceiver#init的初始化逻辑如下:
- 主要负责实例化Netty客户端,开启对2280端口通信的监听
- 选择网络通信方式时,根据操作系统,linux下使用epoll更加高效
- 绑定消息编解码器、设置网络配置参数
- m_logger是通过Plexus容器的LoggerManager自动初始化注入的,LoggerManager默认设置为Log4j。该logger的打印是落磁盘的
public void init() {try {// 默认2280端口启动Netty客户端startServer(m_port);} catch (Exception e) {m_logger.error(e.getMessage(), e);}
}public synchronized void startServer(int port) throws InterruptedException {// 根据操作系统,设置netty的相关工作线程数量和channel通信方式boolean linux = getOSMatches("Linux") || getOSMatches("LINUX");int threads = 24;ServerBootstrap bootstrap = new ServerBootstrap();m_bossGroup = linux ? new EpollEventLoopGroup(threads) : new NioEventLoopGroup(threads);m_workerGroup = linux ? new EpollEventLoopGroup(threads) : new NioEventLoopGroup(threads);bootstrap.group(m_bossGroup, m_workerGroup);// linux使用epollbootstrap.channel(linux ? EpollServerSocketChannel.class : NioServerSocketChannel.class);bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();// pipeline添加消息编解码器pipeline.addLast("decode", new MessageDecoder());pipeline.addLast("encode", new ClientMessageEncoder());}});// 对bootstrap进行网络通信配置bootstrap.childOption(ChannelOption.SO_REUSEADDR, true);bootstrap.childOption(ChannelOption.TCP_NODELAY, true);bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);try {m_future = bootstrap.bind(port).sync();m_logger.info("start netty server!");} catch (Exception e) {m_logger.error("Started Netty Server Failed:" + port, e);}
}
2. MessageDecoder消息解码器
MessageDecoder继承了ByteToMessageDecoder类,在netty通道上有消息进入时会被调用。对Byte字节码进行解析。且,MessageDecoder是TcpSocketReceiver的一个内部类,直接引用了后者注入的MessageHandler和ServerStatisticManager,是服务端消息处理的入口。
在其代码中,首先对消息定长读取,获取消息的长度,实现对半包/粘包问题的处理。之后,读到消息体,通过NativeMessageCodec或PlainTextMessageCodec消息解码实现类,将byte转换为MessageTree对象。再使用MessageHandler实现对消息的处理消费。最后,通过ServerStatisticManager对处理消息情况进行统计。
public class MessageDecoder extends ByteToMessageDecoder {// 已经处理的消息数量private long m_processCount;@Overrideprotected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception {// 定长解码,头4字节是消息体长度if (buffer.readableBytes() < 4) {// 不足4字节,半包return;}buffer.markReaderIndex();int length = buffer.readInt();buffer.resetReaderIndex();if (buffer.readableBytes() < length + 4) {// 小于length半包return;}try {if (length > 0) {// 定长读取,避免粘包ByteBuf readBytes = buffer.readBytes(length + 4);readBytes.markReaderIndex();// 读取数据进行解码,默认是NativeMessageCodec,实现逻辑就是各种长度协议,不详述了DefaultMessageTree tree = (DefaultMessageTree) CodecHandler.decode(readBytes);readBytes.resetReaderIndex();tree.setBuffer(readBytes);// 消息处理器,准备消费消息m_handler.handle(tree);// 统计数量,每1000条执行一次统计m_processCount++;long flag = m_processCount % CatConstants.SUCCESS_COUNT;if (flag == 0) {m_serverStateManager.addMessageTotal(CatConstants.SUCCESS_COUNT);}} else {// client message is errorbuffer.readBytes(length);BufReleaseHelper.release(buffer);}} catch (Exception e) {m_serverStateManager.addMessageTotalLoss(1);m_logger.error(e.getMessage(), e);}}
}
3. MessageConsumer消费
3.1 消费机制
CAT服务端的消息消费者并没有直接对所有收到的消息进行计算等逻辑,而是使用“生产消费者”模式,异步的处理消息,以此避免阻塞提高消息的处理效率。接收消息作为生产,以小时为单位划分Period进行消费管理。
为什么要按小时生成Period来充当消费者?
- 由于CAT是内存实时计算,按小时划分可以有效节省内存,某小时内消息异常,不会影响下一小时的计算,提高可靠性
- 按小时处理消息,只处理当前一小时的数据,避免堆积造成内存泄漏
3.2 Period任务管理
MessageConsumer通过PeriodManager对周期进行管理,通过周期策略PeriodStrategy类创建/删除Period。Period管理所有的PeriodTask和消息分析器Analyser,实现对消息的处理。他们的关系如下
消息分析器MessageAnalyzer具有多种,如上图所示,通过plexus容器注入,后续介绍。
3.2.1 RealtimeConsumer
RealtimeConsumer注入了PeriodManger,前者的初始化方法,完成了对PeriodManger的初始化,并启动线程来循环执行其管理任务。com.dianping.cat.analysis.RealtimeConsumer#initialize()是逻辑入口,代码如下:
@Override
public void initialize() throws InitializationException {// 周期管理初始化m_periodManager = new PeriodManager(HOUR, m_analyzerManager, m_serverStateManager, m_logger);m_periodManager.init();// 开启周期任务管理Threads.forGroup("cat").start(m_periodManager);//初始化过滤配置/filter.properties,排除不需要的domain对应的消息ExcludeConfigInitializer.initialize();
}
3.2.2 PeriodManager
PeriodManager继承自Task,不断轮训是否需要生成新的,或删除过期的Period,并开启Period。PeriodStrategy策略用来判断创建/删除。
PeriodManager在实例化时,会创建PeriodStrategy设置默认的周期1Hour,提前、超时时间都是3min。并在init方法初始化时,开启第一个period周期。
PeriodStrategy用于计算下一个周期的开始时间,当返回值大于0时,则PeriodManager创建新的Period;小于0时删除过期的Period;等于0时,还在当前周期,不需要创建和删除。
public PeriodManager(long duration, MessageAnalyzerManager analyzerManager, ServerStatisticManager serverStateManager,Logger logger) {// 实例化周期创建策略 1小时为周期,ahead和expire都是3minm_strategy = new PeriodStrategy(duration, EXTRATIME, EXTRATIME);m_active = true;m_analyzerManager = analyzerManager;m_serverStateManager = serverStateManager;m_logger = logger;
}public void init() {// 获取下一个周期任务的开始时间long startTime = m_strategy.next(System.currentTimeMillis());// 开启第一个周期任务startPeriod(startTime);
}@Override
public void run() {while (m_active) {try {long now = System.currentTimeMillis();// 计算下次开启Period的时间,大于0需要开启新的,小于0说明有过期需要删除long value = m_strategy.next(now);if (value > 0) {// 开启PeriodstartPeriod(value);} else if (value < 0) {// 上一个Period已经过期,异步卸载PeriodThreads.forGroup("cat").start(new EndTaskThread(-value));}} catch (Throwable e) {Cat.logError(e);}try {Thread.sleep(1000L);} catch (InterruptedException e) {break;}}
}
开启周期逻辑如下
private void startPeriod(long startTime) {long endTime = startTime + m_strategy.getDuration();Period period = new Period(startTime, endTime, m_analyzerManager, m_serverStateManager, m_logger);// 添加到集合中进行管理,通常就2个,当前小时Period + 不超过3min的LastPeriodm_periods.add(period);period.start();
}
删除逻辑是判断Period的开始时间是否相等,删除过期的Period
private class EndTaskThread implements Task {private long m_startTime;public EndTaskThread(long startTime) {m_startTime = startTime;}@Overridepublic String getName() {return "End-Consumer-Task";}@Overridepublic void run() {// 执行结束方法endPeriod(m_startTime);}
}
private void endPeriod(long startTime) {int len = m_periods.size();// 遍历peroid集合,结束删除相关周期for (int i = 0; i < len; i++) {Period period = m_periods.get(i);if (period.isIn(startTime)) {// 处理checkPoint,记录日志period.finish();// 移除周期m_periods.remove(i);break;}}
}
周期策略分析
PeriodStrategy的核心逻辑如下:
- 通过当前时间毫秒数计now算出当前周期的开始时间startTime(小时整点)
- startTime是否大于m_lastStartTime上一个周期的开始时间,初始化时,m_lastStartTime标记为0,故能创建。之后到57min之前,m_lastStartTime == 当前周期startTime,返回0,不创建新的Period
- 当now超过57分(m_duration-m_aheadTime = 60 -3 = 57)后,标记m_lastStartTime为下一个小时的整点,并返回下一个小时的整点startTime + 1hour,提前3min创建下一个Period。
- 之后,再次调用next时,now-m_lastEndTime由于m_lastEndTime初始化为0,差一定大于63。故,返回0,m_lastEndTime设置为当前周期的startTime
- 之后的调用,3个判断都不满足,始终返回0,不创建新的period,也不删除period。直到now到达下一个小时,且超过3分钟时,返回上m_lastEndTime的负值,标记将对应Period删除
核心代码如下:
public long next(long now) {long startTime = now - now % m_duration;// m_lastStartTime是一个标记为,记录上一个周期的开始时间// 创建当前小时的periodif (startTime > m_lastStartTime) {m_lastStartTime = startTime;return startTime;}// 57分以后,计算出下一个小时的整点, 提前3min创建下个periodif (now - m_lastStartTime >= m_duration - m_aheadTime) {m_lastStartTime = startTime + m_duration;return startTime + m_duration;}// last period is over// 大于63, 上次结束时间更新为当前小时,返回负数,清理上一小时的periodif (now - m_lastEndTime >= m_duration + m_extraTime) {long lastEndTime = m_lastEndTime;m_lastEndTime = startTime;return -lastEndTime;}return 0;
}
3.3 Period&PeriodTask
Period通过PeriodManager创建和开启,实例时会创建所有的MessageAnalyzer的PeriodTask集合,通过Start方法开启后,遍历执行PeriodTask消费消息。PeriodTask种使用BlockingQueue来暂存Consumer生产的MessageTree消息,并从中读取进行消费。
Period的实例化逻辑:
- 通过AnalyzerManager获取配置的所有消息分析器名称,并创建对应的PeriodTask列表(分析器下次讲)
- 同一name的Analyzer实例默认会创建2个来进行消费,可配置(分析器下次讲)
public Period(long startTime, long endTime, MessageAnalyzerManager analyzerManager,ServerStatisticManager serverStateManager, Logger logger) {m_startTime = startTime;m_endTime = endTime;m_analyzerManager = analyzerManager;m_serverStateManager = serverStateManager;m_logger = logger;// 获取所有配置的分析器List<String> names = m_analyzerManager.getAnalyzerNames();m_tasks = new HashMap<String, List<PeriodTask>>();for (String name : names) {// 获取分析器实例List<MessageAnalyzer> messageAnalyzers = m_analyzerManager.getAnalyzer(name, startTime);for (MessageAnalyzer analyzer : messageAnalyzers) {// 通过name,分析器实例创建分析任务MessageQueue queue = new DefaultMessageQueue(QUEUE_SIZE);PeriodTask task = new PeriodTask(analyzer, queue, startTime);task.enableLogging(m_logger);List<PeriodTask> analyzerTasks = m_tasks.get(name);if (analyzerTasks == null) {analyzerTasks = new ArrayList<PeriodTask>();m_tasks.put(name, analyzerTasks);}analyzerTasks.add(task);}}
}
Period的Start方法,记录相关信息,通过线程开始遍历执行PeriodTask;distribute方法用于遍历所有管理的task,遍历并添加消息到队列中。
public void start() {// 记录信息SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");m_logger.info(String.format("Starting %s tasks in period [%s, %s]", m_tasks.size(), df.format(new Date(m_startTime)),df.format(new Date(m_endTime - 1))));for (Entry<String, List<PeriodTask>> tasks : m_tasks.entrySet()) {List<PeriodTask> taskList = tasks.getValue();for (int i = 0; i < taskList.size(); i++) {PeriodTask task = taskList.get(i);task.setIndex(i);// 开启任务Threads.forGroup("Cat-RealtimeConsumer").start(task);}}
}// 上层生产消息是调用
public void distribute(MessageTree tree) {// 统计消息数量m_serverStateManager.addMessageTotal(tree.getDomain(), 1);boolean success = true;String domain = tree.getDomain();// 遍历所有的taskfor (Entry<String, List<PeriodTask>> entry : m_tasks.entrySet()) {List<PeriodTask> tasks = entry.getValue();int length = tasks.size();int index = 0;boolean manyTasks = length > 1;if (manyTasks) {// 根据domain的hash值,选择一个task负载任务index = Math.abs(domain.hashCode()) % length;}PeriodTask task = tasks.get(index);// 添加到队列,失败时尝试向下一个task添加boolean enqueue = task.enqueue(tree);if (!enqueue) {if (manyTasks) {task = tasks.get((index + 1) % length);enqueue = task.enqueue(tree);if (!enqueue) {success = false;}} else {success = false;}}}
}
PeriodTask的核心方法如下,
- run方法调用分析器解析消息
- enqueue方法判断数据是否合格,并尝试添加到queue中
public boolean enqueue(MessageTree tree) {if (m_analyzer.isEligable(tree)) {// 尝试加入队列boolean result = m_queue.offer(tree);if (!result) { // 加入队列失败,1000条记录一次日志m_queueOverflow++;if (m_queueOverflow % (10 * CatConstants.ERROR_COUNT) == 0) {String date = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date(m_analyzer.getStartTime()));m_logger.warn(m_analyzer.getClass().getSimpleName() + " queue overflow number " + m_queueOverflow + " analyzer time:" + date);}}return result;} else {return true;}
}
3.4 RealtimeConsumer
RealtimeConsumer的consume方法在解码器中通过MessageHandler被调用。消费时,过滤特定的路径,并根据消息时间戳查找Period。找到Period后,执行distrube方法进行消息分发,即获取到所有的PeriodTask遍历执行enqueue,添加消息到队列中。
com.dianping.cat.analysis.RealtimeConsumer#consume
@Override
public void consume(MessageTree tree) {ExcludePathFilter pathFilter = ExcludeConfigInitializer.getPathFilter();String domain = tree.getDomain();// /filter.properties 过滤domainif (!pathFilter.filter(domain)) {long timestamp = tree.getMessage().getTimestamp();// 根据消息时间查找PeriodPeriod period = m_periodManager.findPeriod(timestamp);if (period != null) {// 分发消息period.distribute(tree);} else {m_serverStateManager.addNetworkTimeError(1);}} else {//记录错误 domain 数量Cat.logEvent("DroppedIllegalDomain",domain);}
}
整体的生产-消费流程如下图:
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- spline: 计算机曲线简史(转载)
作者: Alastair Townsend (经过作者亲自授权) 英文网址: http://www.alatown.com/spline-history-architecture 中文整理: 马海东 ,并提供了一个deboor曲线算法的grasshopper插件(见文末的下载链接) 一些建筑师将采用自由曲面设计和计算机辅助制造技术称为前沿,甚…...
2024/4/4 14:31:16 - Spring Boot尚硅谷笔记整理——Spring Boot 入门
一、Spring Boot 入门 1、Spring Boot 简介 简化Spring应用开发的一个框架; 整个Spring技术栈的一个大整合; J2EE开发的一站式解决方案; 2、微服务 2014,martin fowler 微服务:架构风格(服务微化&#x…...
2024/4/27 11:26:20 - 方案虽好,成本先行:数据库Sharding+Proxy实践解析
一、分库分表的背景 在谈论数据库架构演变和优化时,我们经常会听到分片、分库分表(Sharding)这样的关键词,在很长一段时间内,在各个公司、各中技术论坛里都很热衷谈论各种分片方案,尤其是互联网非常普及的…...
2024/4/4 11:10:05 - DaVinci Resolve 17 mac新功能
DaVinci Resolve 17是一次重大更新,这一版本汇集了超过100项新功能和200项改进!调色页面设立了新的HDR调色工具,重新设计了一级校色控制工具,并添加了基于AI的Magic Mask遮罩等功能。Fairlight更新了能提高工作效率的鼠标和键盘编…...
2024/4/4 11:45:56 - 工具篇-学 C/C++ 所用软件(学 C/C++ 必备软件全都有)
接着上篇的知识技能分享,这次小编给大家带来的是学习C/C相关的工具,需要的下方自取—— C/C软件全知道必备软件合集 资源名称百度网盘一键下载密码 基础班软件全部下载:https://pan.baidu.com/s/1Y0Qd1Y8GbQVoJ39uMfhC6Amkas 局域网通信神器…...
2024/4/4 15:02:51 - 为什么你的产品在亚马逊平台审核不通过?CPSC究竟是什么?
CPSC为美国消费品安全协会,负责制定测试标准。CPSC是一个机构的名称,而我们所说的CPSC认证,即需要找CPSC授权的第三方实验室出具的测试文件。 涉及范围:CPSC管理的产品涉及1500种以上,主要是家用电器、儿童玩具、烟花爆…...
2024/4/4 12:38:42 - 郭禹缘:刺激!欧美股市大涨,黄金暴跌后又出现震荡式上涨?
大家午好,郭禹缘致各位投资朋友:你以将就的态度对待生活,生活也将以得过且过的结果回报你;而当你以精益求精的标准要求自己时,生活也会回报给你相对完美的结果。正像我们的人生,你对人生认真,人…...
2024/4/4 13:10:03 - 数据脱敏-简单
什么是数据脱敏? 百度百科是这样描述的: 数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据…...
2024/4/10 9:18:55 - 【JVM面试系列5】深入分析Java垃圾收集算法和常用垃圾收集器
文章目录 前言如何确定无效对象引用计数法(Reference Counting)可达性分析算法(Reachability Analysis)GC Root引用的分类(1)强引用(2)软引用(3)弱引用(4)虚引用(Phantom Reference)垃圾收集算法:1、标记-清除(Mark-Sweep)算法标记-清除算法的缺点2、复制(Copying)算法…...
2024/4/4 16:47:01 - 密码学 ~ 非对称加密 RSA ECC
非对称加密 ① 非对称加密算法又称现代加密算法。 ② 非对称加密是计算机通信安全的基石,保证了加密数据不会被破解。 ③ 与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey) 和私有密(privatekey) ④ 公开密钥和私有密钥是…...
2024/4/7 0:29:48 - 2020年下半年网络工程师下午真题及答案
试题一(20分) 某校园宿舍WLAN网络拓扑结构如图1-1所示,数据规划如表1-1内容所示。该网络采用敏捷分布式组网在每个宿舍部署一个AP,AP连接到中心AP,所有AP和中心AP统一由AC进行集中管理,为每个宿舍提供高质量…...
2024/4/7 3:03:45 - 企业风险定价中的Expected loss估计
金融高频触发交易场景下的信贷风险定价不同于风险建模和策略分析,前两者倾向于应用统计或数学进行风险估计,而一旦进入到风险定价环节,则更多会基于金融模型进行风险散度归整。 本文分享是基于我近期在看的一些关于企业估值、风险定价方面的…...
2024/4/4 16:12:08 - CodeRunner for Mac多功能代码编辑器
CodeRunner for mac是Mac os平台上的一款帮助开发人员编程开发的Mac开发软件,CodeRunner for mac是一款Mac平台上的编程开发软件,它不需要安装额外的语言环境就可以执行一些代码, 还能立即查看运行后的效果。本站提供CodeRunner Mac破解版&am…...
2024/4/23 3:52:37 - 台湾服务器丢包高的原因
台湾地区的服务器由于距离大陆比较近,在实际使用上出现丢包可能性比较小,基本都维持在5%以下,理论上使用体验是比较快的,搭建网站也能快速加载页面,然而现在有不少站长发现自己租用的台湾服务器的丢包率有点高…...
2024/4/15 4:07:32 - 分布式面试专栏-redis面试整理(1)
分布式面试专栏 文章目录分布式面试专栏redis面试整理1、什么是 Redis?简述它的优缺点?2、Redis 与 memcached 相比有哪些优势?3、Redis 支持哪几种数据类型?4、Redis 主要消耗什么物理资源?5、Redis 有哪几种数据淘汰策略?6、Redis 官方为什么不提供 Windows 版本?7、一…...
2024/4/17 8:35:15 - vue面试知识点
0.那你能讲一讲MVVM吗? MVVM是Model-View-ViewModel缩写,也就是把MVC中的Controller演变成ViewModel。Model层代表数据模型,View代表UI组件,ViewModel是View和Model层的桥梁,数据会绑定到viewModel层并自动将数据渲染到…...
2024/4/17 11:37:45 - python——面向对象那些事-2
1、一个对象的属性可以是另外一个类创建的对象。 class Gun:def __init__(self, model):self.model modelself.bullet_count 0def add_bullet(self, count):self.bullet_count countdef shoot(self):if self.bullet_count < 0:print("[%s] 没有子弹了。。"%sel…...
2024/4/17 9:29:35 - ipfs项目是不是真的?矿机多少钱一台呀
ipfs项目是不是真的?ipfs项目介绍 PFS/Filecoin是是区块链10年发展中唯一一个落地应用,改变互联网使用方式的应用,国内的京东,华为,阿里巴巴都有相继报道,像央视,人民日报,各大权威媒…...
2024/4/17 10:50:20 - 商品详情页系统架构-笔记5-结合代码实现
目录 Cache aside pattern 双写不一致,怎么保证 数据库与缓存更新与读取操作进行异步串行化 1、线程池内存 2、两种请求对象封装 3、请求异步执行Service封装 4、请求处理的工作线程封装 5、两种请求Controller接口封装 6、读请求去重优化 7、空数据的读请…...
2024/4/16 18:18:28 - EN71part1-11的内容描述
EN 71 Part 1 1、EN 71 Part 1:2005A9:2009-physical &mechanical Test 物理和机械性测试 (a)Without Sound module 不发声玩具 (b)With Sound module 发声玩具 ©Earphone with Sound 耳机发声玩具 (d)7000 Cycles Switch Test for Chest 玩具柜的7000次开关测试 (e)R…...
2024/4/17 13:41:07
最新文章
- 基于Springboot的交流互动系统
基于SpringbootVue的交流互动系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 帖子信息 聚会信息 后台登录 后台管理首页 用户管理 帖子分类管理 帖子信息…...
2024/5/3 19:35:08 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 01背包问题 小明的背包
2.小明的背包1 - 蓝桥云课 (lanqiao.cn) #include <bits/stdc.h> using namespace std; const int N1010;//开始写的105 开小了 样例过了但最后只过了很少一部分 int n,m; int v[N],w[N]; int f[N][N];int main() {cin>>n>>m;for(int i1;i<n;i){cin>&…...
2024/4/30 7:25:11 - DevOps三步法之反馈:流动是油门,反馈是刹车
打个比方,流动是油门,反馈是刹车。流动是关于行使,反馈是关于安全。车辆要想持续平稳运行,需要油门与刹车良好配合,否则就有可能车毁人亡。核电站需要使核反应处于临界状态,超出临界状态就是核爆炸这也需要…...
2024/5/3 14:13:48 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/5/3 11:50:27 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/5/2 16:04:58 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/5/2 23:55:17 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/3 16:00:51 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/5/3 11:10:49 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/5/2 6:03:07 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/2 9:47:30 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/5/2 23:47:43 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/3 13:26:06 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/5/3 1:55:15 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/5/2 9:47:28 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/3 16:23:03 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/5/3 1:55:09 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/5/2 8:37:00 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/3 14:57:24 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/2 9:47:25 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/5/2 23:47:16 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/2 18:46:52 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/3 7:43:42 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/5/3 1:54:59 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57