为什么每个程序员都必须坚持写博客?这篇文章教你怎么写!

2023-11-05

V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

一、往期回顾

上篇文章《为什么有些看起来很厉害的技术高手,设计的架构都很垃圾?》,主要聊了一下将单块系统重构为分布式系统,以此来避免单台机器的负载过高。同时引申出来了弹性资源调度、分布式容错机制等相关的东西。

这篇文章我们继续来聊聊这个系统后续的重构演进过程,先来看下目前的系统架构图,一起来回顾一下。

在这里插入图片描述

二、百亿流量的高并发技术挑战

上篇文章说到,如果仅仅只是每天亿级流量的话,其实基本上目前的系统架构就足够支撑了,但是呢,我们面临的可不仅仅是亿级流量那么简单。我们面对的是日益增多和复杂的各种业务系统,我们面对的是不断增加的系统用户,我们面对的是即将迎来每天百亿级的高并发流量。

给大家先说下当时的系统部署情况,数据库那块一共部署了8主8从,也就是16台数据库服务器,每个库都是部署在独立的数据库服务器上的,而且全部用的是物理机,机器的配置,如果没记错的话,应该是32核+128G+SSD固态硬盘。

为啥要搞这么多物理机,而且全部都是高配置呢?不知道大家发现没有,目前为止,我们最大的依赖就是MySQL!

之前给大家解释过,在当时的背景下,我们要对涌入的亿级海量数据,实时的运行数百个复杂度为几百行到上千行的大SQL,几秒钟就要出分析结果。

这个是没有任何一个开源系统可以做到的,Storm不行,Spark Streaming也不行,因此必须得基于MySQL纯自研一套数据平台架构出来,支撑这个需求场景。

所以,只有MySQL是可以支撑如此复杂的SQL语句完美运行的,因此我们在早期必须严重依赖于MySQL作为数据的存储和计算,将源源不断涌入的数据放在MySQL中进行存储,接着基于数据分片计算的架构来高性能的运行复杂大SQL基于MySQL来进行计算。


所以大家就知道了,MySQL目前为止是这套系统的命脉。在当时的场景下,每台数据库服务器都要抗住每秒2000左右的并发请求,高峰期的CPU负载、IO负载其实都非常高,而且主库和从库的延迟在高峰期已经有点严重,会达到秒级了。

在我们的生产系统的实际线上运行情况下,单台MySQL数据库服务器,我们一般是不会让他的高峰期并发请求超过2000/s的,因为一旦达到每秒几千的请求,根据当时线上的资源负载情况来看,很可能MySQL服务器负载过高会宕机。

所以此时就有一个很尴尬的问题了,假如说每天亿级流量的场景下,需要用8主8从这么多高配置的数据库服务器来抗,那如果是几十亿流量呢?甚至如果是百亿流量呢?难道不停的增加更多的高配置机器吗?

要知道,这种高配置的数据库服务器,如果是物理机的话,是非常昂贵的!

之前给大家简单介绍过项目背景,这整套大型系统组成的商业级平台,涉及到N多个系统,这个数据产品只是一个子产品而已,不可能为了这么一个产品,投入大量的预算通过不停的砸高配置的机器来撑住更高的并发写入。

我们必须用技术的手段来重构系统架构,尽量用有限的机器资源,通过最优秀的架构来抗住超高的并发写入压力!


三、计算与存储分离的架构

这个架构里的致命问题之一,就是数据的存储和计算混在了一个地方,都在同一个MySQL库里!

大家想想,在一个单表里放上千万数据,然后你每次运行一个复杂SQL的时候,SQL里都是通过索引定位到表中他要计算的那个数据分片。这样搞合适吗?

答案显然是否定的!因为表里的数据量很大,但是你每次实际SQL运算只要对其中很小很小的一部分数据计算就可以了,实际上我们在生产环境中实践过后发现,如果你在一个大表运行一个复杂SQL,哪怕通过各种索引保证定位到的数据量很少,因为表数据量过大,也是会导致性能直线下降的。

因此第一件事情,先将数据的存储和计算这两件事情拆开。

我们当时的思路如下:

  • 数据直接写入一个存储,仅仅只是简单的写入即可
  • 然后在计算的时候从数据存储中提取你需要的那个数据分片里的可能就一两千条数据,写入另外一个专用于计算的临时表中,那个临时表内就这一两千条数据
  • 然后运行你的各种复杂SQL即可。

bingo!一旦将数据存储和计算两个事情拆开,架构里可以发挥的空间就大多了。


首先你的数据存储只要支撑高并发的写入,日百亿流量的话,高峰每秒并发会达到几十万,撑住这就可以了。然后支持计算引擎通过简单的操作从数据存储里提取少量数据就OK。

太好了,这个数据存储就可以PASS掉MySQL了,就这点儿需求,你还用MySQL干什么?兄弟!

当时我们经过充分的技术调研和选型之后,选择了公司自研的分布式KV存储系统,这套KV存储系统是完全分布式的,高可用,高性能,轻量级,支持海量数据,而且之前经历过公司线上流量的百亿级请求量的考验,绝对没问题。主要支持高并发的写入数据以及简单的查询操作,完全符合我们的需求。

这里给大家提一句,其实业内很多类似场景会选择hbase,所以大家如果没有公司自研的优秀kv存储的话,可以用选用hbase也是没问题的,只不过hbase有可能生产环境会有点坑,需要大家对hbase非常精通,合理避坑和优化。


轻量级的分布式kv系统,一般设计理念都是支持一些简单的kv操作,大量的依托于内存缓存热数据来支持高并发的写入和读取,因为不需要支持MySQL里的那些事务啊、复杂SQL啊之类的重量级的机制。

因此在同等的机器资源条件下,kv存储对高并发的支撑能力至少是MySQL的数倍甚至数十倍。

就好比说,大家应该都用过Redis,Redis普通配置的单机器撑个每秒几万并发都是ok的,其实就是这个道理,他非常的轻量级,转为高并发而生。

然后,我们还是可以基于MySQL中的一些临时表来存放kv存储中提取出来的数据分片,利用MySQL对复杂SQL语法的支持来进行计算就可以了。也就是说,我们在这个架构里,把kv系统作为存储,把MySQL用做少量数据的计算。

此时我们在系统架构中引入了分布式kv系统来作为我们的数据存储,每天的海量数据都存放在这里就可以了,然后我们的Slave计算引擎每次计算,都是根据那个数据分片从kv存储中提取对应的数据出来放入MySQL内的一个临时表,接着就是对那个临时表内的一两千条数据分片运行各种复杂SQL进行计算即可。

在这里插入图片描述

大家看上面的图,此时通过这一步计算与存储架构的分离,我们选用了适合支撑高并发的kv集群来抗住每天百亿级的流量写入。然后基于MySQL作为临时表放入少量数据来进行运算。这一个步骤就直接把高并发请求可以妥妥的抗住了。

而且分布式kv存储本来就可以按需扩容,如果并发越来越高,只要扩容增加机器就可以了。此时,就完成了架构的一个关键的重构步骤。


四、自研纯内存SQL计算引擎

下一步,我们就要对架构追求极致!因为此时我们面临的一个痛点就在于说,其实仅仅只是将MySQL作为一个临时表来计算了,主要就是用他的复杂SQL语法的支持。

但是问题是,对MySQL的并发量虽然大幅度降低了,可是还并不算太低。因为大量的数据分片要计算,还是需要频繁的读写MySQL。

此外,每次从kv存储里提取出来了数据,还得放到MySQL的临时表里,还得发送SQL去MySQL里运算,这还是多了几个步骤的时间开销。

因为当时面临的另外一个问题是,每天请求量大,意味着数据量大,数据量大意味着时间分片的计算任务负载还是较重。

总是这么依赖MySQL,还要额外维护一大堆的各种临时表,可能多达几百个临时表,你要维护,要注意他的表结构的修改,还有分库分表的一些运维操作,这一切都让依赖MySQL这个事儿显得那么的多余和麻烦。

因此,我们做出决定,为了让架构的维护性更高,而且将性能优化到极致,我们要自己研发纯内存的SQL计算引擎


其实如果你要自研一个可以支持MySQL那么复杂SQL语法的内存SQL计算引擎,还是有点难度和麻烦的。但是在我们仔细研究了业务需要的那几百个SQL之后,发现其实问题没那么的复杂。

因为其实一般的数据分析类的SQL,主要就是一些常见的功能,没有那么多的怪、难、偏的SQL语法。

因此我们将线上的SQL都分析过一遍之后,就针对性的研发出了仅仅支持特定少数语法的SQL引擎,包括了嵌套查询组件、多表关联组件、分组聚合组件、多字段排序组件、少数几个常用函数,等等。

接着就将系统彻底重构为不再依赖MySQL,每次从kv存储中提取一个数据分片之后,直接放入内存中,然后用我们自研的SQL计算引擎来在纯内存里针对一个数据分片执行各种复杂的SQL。

这个纯内存操作的性能,那就不用多说了,大家应该都能想象到了,基本上纯内存的SQL执行,都是毫秒级的,基本上一个时间分片的运算全部降低到毫秒级了。性能进一步得到了大幅度的提升,而且从此不再依赖MySQL了,不需要维护复杂的分库分表等等东西。

在这里插入图片描述

这套架构上线之后,彻底消除了对MySQL的依赖,理论上,无论多大的流量过来,都可以通过立马扩容kv集群以及扩容Slave计算集群来解决,不需要依赖MySQL的分库分表、几百张临时表等比较耗费人力、麻烦而且坑爹的方案了。而且这种纯内存的计算架构直接把计算性能提升到了毫秒级。

而且消除对MySQL的依赖有另外一个好处,数据库的机器总是要高配置的,但是Slave机器主要4核8G的普通虚拟机就够了,分布式系统的本质就是尽量利用大量的廉价普通机器就可以完成高效的存储和计算。

因此在百亿流量的负载之下,我们Slave机器部署了几十台机器就足够了,那总比你部署几十台昂贵的高配置MySQL物理机来的划算多了!


五、MQ削峰以及流量控制

其实如果对高并发架构稍微了解点的同学都会发现,这个系统的架构中,针对高并发的写入这块,还有一个比较关键的组件要加入,就是MQ。

因为我们如果应对的是高并发的非实时响应的写入请求的话,完全可以使用MQ中间件先抗住海量的请求,接着做一个中间的流量分发系统,将流量异步转发到kv存储中去,同时这个流量分发系统可以对高并发流量进行控制。

比如说如果瞬时高并发的写入真的导致后台系统压力过大,那么就可以由流量分发系统自动根据我们设定的阈值进行流量控制,避免高并发的压力打垮后台系统。

而且在这个流控系统中,我们其实还做了很多的细节性的优化,比如说数据校验、过滤无效数据、切分数据分片、数据同步的幂等机制、100%保证数据落地到kv集群的机制保障,等等。

在这里插入图片描述

公司的MQ集群天然都支撑过大流量写入以及高并发请求,因此MQ集群那个层面抗住高并发并不是什么问题,再高的并发按需扩容就可以了,然后我们自己的流控系统也是集群部署的,线上采用的是4核8G的虚拟机,因为这个机器不需要太高的配置。

流控系统,基本线上我们一般保持在每台机器承载每秒小三千左右的并发请求,百亿流量场景下,高峰每秒并发在每秒小几十万的级别,因此这个流控集群部署到几十台机器就足够了。

而公司的kv集群也是天然支撑过大流量高并发写入的,因此kv集群按需扩容,抗住高并发带流量的写入也不是什么问题,而且这里其实我们因为在自身架构层面做了大量的优化(存储与计算分离的关键点),因此kv集群的定位基本就是online storage,一个在线存储罢了。

通过合理、巧妙的设计key以及value的数据类型,使得我们对kv集群的读写请求都是优化成最最简单的key-value的读写操作,天然保证高并发读写是没问题的。

另外稍微给大家一点点的剧透,后面讲到全链路99.99%高可用架构的时候,这个流控集群会发挥巨大的作用,他是承上启下的一个效果,前置的MQ集群故障的高可用保障,以及后置的KV集群故障的高可用保障,都是依靠流控集群来实现的。


六、数据的动静分离架构

在完成上述重构之后,我们又对核心的自研内存SQL计算引擎做了进一步的优化。因为实际生产环境运行过程中,我们发现了一个问题:就是每次如果Slave节点都是对一个数据分片提取相关联的各种数据出来然后进行计算,其实是没必要的!

给大家举个例子,如果你的SQL要对一些表进行关联计算,里面涉及到了一些大部分时候静态不变的数据,那些表的数据一般很少改变,因此没必要每次都走网络请求从kv存储里提取那部分数据。

我们其实完全可以在Slave节点对这种静态数据做个轻量级的cache,然后只有数据分片里对应的动态改变的数据才从kv存储来提取数据。

通过这个数据的动静分离架构,我们基本上把Slave节点对kv集群的网络请求降低到了最少,性能提升到了最高。大家看下面的图。

在这里插入图片描述

七、阶段性总结

这套架构到此为止,基本上就演进的比较不错了,因为超高并发写入、极速高性能计算、按需任意扩容,等各种特性都可以支持到了,基本上从写入到计算,这两个步骤,是没什么太大的瓶颈了。

而且通过自研内存SQL计算引擎的方案,将我们的实时计算性能提升到了毫秒级的标准,基本已经达到极致。

八、下一步展望

下一步,我们就要看看这个架构中的左侧,还有一个MySQL呢!

首先是实时计算链路和离线计算链路,都会导入大量的计算结果到那个MySQL中。

其次面向数十万甚至上百万的B端商家时,如果是实时展示数据分析结果的话,一般页面上会有定时的JS脚本,每隔几秒钟就会发送请求过来加载最新的数据计算结果。

因此实际上那个专门面向终端用户的MySQL也会承受极大的数据量的压力,高并发写入的压力以及高并发查询的压力。

V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

另外推荐儒猿课堂的1元系列课程给您,欢迎加入一起学习~

互联网Java工程师面试突击课(1元专享)

SpringCloudAlibaba零基础入门到项目实战(1元专享)

亿级流量下的电商详情页系统实战项目(1元专享)

Kafka消息中间件内核源码精讲(1元专享)

12个实战案例带你玩转Java并发编程(1元专享)

Elasticsearch零基础入门到精通(1元专享)

基于Java手写分布式中间件系统实战(1元专享)

基于ShardingSphere的分库分表实战课(1元专享)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么每个程序员都必须坚持写博客?这篇文章教你怎么写! 的相关文章

  • MySQL Workbench 深色主题

    我刚刚开始学习 SQL 课程 并且一直在尝试不同的 GUI 我喜欢使用 MySQL Workbench 但白色背景刺瞎了我的眼睛 我已经搜索并找到了一些其他讨论编辑 xml 文件的相关帖子 我尝试用几种不同的方式对其进行编辑 但无济于事 我
  • 是否有任何理由使用 ZoneId.of("UTC") 而不是 ZoneOffset.UTC ?

    有什么理由使用ZoneId of UTC 代替ZoneOffset UTC 我们知道两者之间的区别 如ZoneOffset UTC 和 ZoneId of UTC 之间有什么区别 https stackoverflow com questi
  • 带嵌入式 tomcat 的 spring-boot 不会将请求分派到控制器

    我有一个使用 spring boot 和嵌入式 Tomcat 容器的应用程序 据我所知 我的代码与 spring boot 相同示例项目 https github com spring projects spring boot tree m
  • Byte[] 和 java.lang.OutOfMemoryError 按位读/写文件

    我正在努力擦除 Android 中的一些可用空间 这是我的代码 private void creatingFileDelete int size int passMode File lastFile new File Environment
  • 如何使用Gson将JSONArray转换为List?

    在我的 Android 项目中 我试图将收到的 JSONArray 转换为列表 在 的帮助下这个答案 https stackoverflow com questions 8371274 how to parse json array in
  • 如何防止我的 servlet 被其他网站调用

    好的 我有一个像这样的简单的 servlet public class SimpleServlet extends HttpServlet public void doPost HttpServletRequest req HttpServ
  • 字符串 a == 字符串 b 的规则 [重复]

    这个问题在这里已经有答案了 我试图了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是什么 例如这个片段 public static void main String hi String s1 lol String s2 lol S
  • java多线程中“私有最终对象”锁定有什么用?

    java多线程中 私有最终对象 锁定有什么用 据我的理解 我认为要使一个类成为线程安全的 我们应该使用内部锁定 将所有方法标记为同步并使用 this 将它们锁定在对象的监视器上 或者我们可以用方法中的私有最终对象锁替换类的 this 上标记
  • Mysql使用触发器建表

    我尝试在 Mysql 触发器内创建表 但没有创建 如何使用触发器创建表 这里传递的表的名称是动态的 据我所知 在触发器内创建表是不可能的 看这里 http forums mysql com read php 99 121849 122609
  • 将序列化数据发送到 servlet 时出现 java.io.EOFException

    我正在尝试从 Java 本地应用程序上传一个包含文件到服务器的对象 我的计划是 在 tomcat 上运行的 servlet 将使用以下方法获取对象ObjectInputStream in the doGet方法 但我得到一个EOFExcep
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • 如何在列表视图中选择时启用视频序列自动播放?

    大家好 有人可以与我分享一下我如何编写我的 viewvideo java 类 以便它允许自动播放视频功能 自动排序在列表视图中播放所选视频的任务 从当前位置到最新录制的视频 按顺序直到最新的视频播放完毕 这类似于 YouTube 自动播放功
  • 如何让 Camel FTP 按需只获取一次

    我对骆驼还很陌生 我一直在尝试让 Camel 根据需要仅通过 FTP 获取单个文件一次 我无法让它发挥作用 这是我尝试过的 让我知道什么是最好的方法以及我的代码有什么问题 1 读取文件后发送一条空消息当收到空消息时 停止路由 from di
  • MySQL 错误 1264:列的值超出范围

    As I SETMySQL 中的 cust fax 表如下所示 cust fax integer 10 NOT NULL 然后我插入这样的值 INSERT INTO database values 3172978990 但随后它说 错误 1
  • 致命异常:OkHttp 调度程序

    我在 Android 应用程序中使用 OkHttp 库向天气 API 发出 Web 请求 我已经实现了我的代码 但在执行请求时遇到了致命异常 我也已经在我的清单中添加了互联网权限 MainActivity java private Curr
  • 如何查找列表/集合是否包含在另一个列表中

    我有一个产品 ID 列表 我想找出哪些订单包含所有这些产品 订单表的结构如下 order id product id 1 222 1 555 2 333 显然我可以通过 PHP 中的一些循环来做到这一点 但我想知道是否有一种优雅的方法可以纯
  • 学说 - 获取下一个和上一个记录

    这样我就已经获取了一些记录 我已创建日期字段 现在我想按日期获取下一条和上一条记录 通过以下方式让它工作 qb this gt createQueryBuilder a next qb gt expr gt gt a created dat
  • CreateProcess error=206,运行 gwtCompile 时文件名或扩展名太长

    我的应用程序是一个 springboot gradle 应用程序 我的应用程序的一部分涉及使用 gradle 进行遗留 gwt 编译 它工作正常 但今天当我运行下面的 gradle 任务时 它显示 CreateProcess error 2
  • 当框架被拖动时,如何设置 JWindow 的位置位于文本字段下方?

    我正在制作一个自动完成项目 就像谷歌一样 我的框架中有一个 jtextfield 每当我在该字段中输入内容时 该文本字段下方就会出现一个 JWindow 并且该窗口来自另一个类 现在的问题是 每当我拖动框架时 如何使窗口始终出现在文本字段下
  • Elastic Beanstalk 上的 Django + MySQL - 查询 MySQL 时出错

    当我在 Elastic beanstalk 上托管的 Django 应用程序上查询 MySQL 时 出现错误 错误说 admin login 处出现操作错误 1045 用户 adminDB 172 30 23 5 的访问被拒绝 使用密码 Y

随机推荐

  • iPad 上如何查看 Safari 页面的 html 源代码

    最近需要解决一个 ipad 上 Safari 浏览器相关的问题 需要查看其中页面的 html 源代码 找了半天 发现浏览器没有提供原生态的功能 最后在网上找到了如下神奇的方式 1 Safari 浏览器定位到你要查看源代码的页面 2 在地址栏
  • Python多进程分片下载远端大文件 - multiprocessing paramiko

    Python多进程分片下载远端大文件 可以按照以下流程设计代码框架 导入需要的模块 首先 导入所需的模块 包括paramiko os和multiprocessing 创建下载函数 创建一个用于分片下载文件的函数 该函数将使用SSH连接到远程
  • 布隆过滤器,原理+案例+代码实现

    概述 什么是布隆过滤器 布隆过滤器 Bloom Filter 是1970年由布隆提出的 它实际上是由一个很长的二进制向量和一系列随意映射函数组成 它是一种基于概率的数据结构 主要用来判断某个元素是否在集合内 它具有运行速度快 时间效率 占用
  • React 中插入图片的三种方式

    使用import 导入 import React Component from react import logo from asset worker png export default class Md extends Componen
  • 【C语言scanf函数用法】

    本节介绍输入函数 scanf 的用法 scanf 和 printf 一样 非常重要 而且用得非常多 所以一定要掌握 概述 scanf 的功能用一句话来概括就是 通过键盘给程序中的变量赋值 该函数的原型为 include
  • 优秀博文-技术栈

    设计模式大牛 https blog csdn net lovelion article category 738450 10 石杉的架构笔记 https juejin im user 5be0588ae51d452b0255727d 程序猿
  • 前端日历控件

    前端日历控件 最简单 使用html自带的type
  • 计算机算法与程序设计 第二章 编程作业

    第二章 编程作业 查看帮助 返回 所有测验 作业和考试都在2020年12月30日23点截止 请及时完成 编程作业题可以多次提交 取最高分作为本题成绩 依照学术诚信条款 我保证此作业是本人独立完成的 温馨提示 1 本次作业属于Online J
  • Echarts

    数据可视化 数据可视化主要目的 借助于图形化手段清晰有效的传达与沟通信息 数据可视化把数据从冰冷的数字转换成图形 揭示蕴含在数据中的规律和道理 Echarts简介 常见的数据可视化库 D3 js 目前 Web 端评价最高的 Javascri
  • 梯度下降法实现线性回归, 实例---预测波士顿房价

    本文先手动实现一个线性回归模型 然后用sklearn的线性回归模型作对比 import pandas as pd df pd read csv house data csv 数据集可到网上下载 波士顿房价 df head Out 1 CRI
  • 【C语言编程】条件编译

    程序满足一定的条件下进行编译 否则不进行编译 目的 有利于程序的可移植性 增加程序的灵活性和通用性 1 宏定义 宏定义 普通的宏定义其实就是我们理解的宏常量 宏定义又称为宏替换 简称 宏 其定义格式如下 define 标识符 字符串 2 条
  • 损失函数loss大总结

    分类任务loss 二分类交叉熵损失sigmoid cross entropy TensorFlow 接口 tf losses sigmoid cross entropy multi class labels logits weights 1
  • C++中stack的用法(超详细,入门必看)

    博主简介 Hello大家好呀 我是陈童学 一个与你一样正在慢慢前行的人 博主主页 陈童学哦 所属专栏 C STL 前言 Hello各位小伙伴们好 欢迎来到本专栏C STL的学习 本专栏旨在帮助大家了解并熟悉使用C 中的STL C 中的STL
  • ssm基于SSM的仓库管理系统的设计与实现97b4r【独家源码】计算机毕业设计问题的解决方案与方法

    本项目包含程序 源码 数据库 LW 调试部署环境 文末可获取一份本项目的java源码和数据库参考 系统的选题背景和意义 选题背景 仓库管理是企业物流管理中的重要环节 涉及到货物的入库 出库 存储和盘点等多个方面 然而 传统的仓库管理方式存在
  • 从39个kaggle竞赛中总结出来的图像分割的Tips和Tricks

    作者丨Derrick Mwiti 来源丨AI公园 编辑丨极市平台 导读 作者参加了39个Kaggle比赛 按照整个比赛的顺序 总结了赛前数据的处理 模型的训练 以及后处理等可以助力大家的tips和tricks 非常多的技巧和经验 现在全部分
  • 香港翡翠台在线直播

    mms 222 170 73 87 tvb001 是TVB HD mms 222 170 73 87 tvb002 是TVB NEWS mms 222 170 73 87 tvb003 是TVB 原版 mms 222 170 73 87 t
  • mysql auto reconnect_MySql的autoReconnect与autoReconnectForPools属性对比

    autoReconnect会向客户端抛出一个SQLException 但会尝试重新建立连接 autoReconnectForPools将在每次执行SQL之前尝试ping服务器 autoReconnect和autoReconnectForPo
  • chisel黑盒(调用verilog书写的模块)

    因为Chisel的功能相对Verilog来说还不完善 所以设计人员在当前版本下无法实现的功能 就需要用Verilog来实现 在这种情况下 可以使用Chisel的BlackBox功能 它的作用就是向Chisel代码提供了用Verilog设计的
  • Windows win10设置网卡优先级

    因为最近在做mqtt服务器 偶然发现手机连接不到笔记本搭建的mqtt服务器 找了半天 发现可能是mqtt没有绑定到无线网卡ip上面 猜测未验证 虽然在绝大多数情况下 Windows 10 系统都能够自动决策出应该优先使用的最佳网络连接顺序
  • 为什么每个程序员都必须坚持写博客?这篇文章教你怎么写!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 一 往期回顾 上篇文章 为什么有些看起来很厉害的技术高手 设计的架构都很垃圾 主要聊了一下将单块系统重构为分布式系统 以此来避免单台机器的负载过高 同时引申出来了弹性