
系统架构
文章平均质量分 68
程序员杂谈
自我评价
诚实信用 勤奋刻苦 有较强的组织能力和团队意识
责任心强 有创新精神 自学能力较好
精通seo优化
展开
-
java中String、StringBuffer和StringBuilder的区别
java中String、StringBuffer和StringBuilder的区别java中用于处理字符串常用的有三个类:1、java.lang.String2、java.lang.StringBuffer3、java.lang.StrungBuilder三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。StringBuffer是线程安全,可以不需要额外的同步用于多线程中;Strin原创 2021-08-28 15:12:53 · 705 阅读 · 0 评论 -
Elasticsearch分片设置 es number_of_shards和number_of_replicas
1、分片是什么?一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,每一份就是一个分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的"索引",这个"索引"可以被放置到集群中的任何节点上。2、分片为什么重要?分片之所以重要,主要有两方面的原因:(1)允许原创 2021-08-28 14:31:34 · 8045 阅读 · 0 评论 -
消息中间件对比
Kafka采用拉取(Pull)方式消费消息,吞吐量相对更高,适用于海量数据收集与传递场景,例如日志采集和集中分析。RabbitMQ在吞吐量方面略有逊色,但支持更多的消息队列功能。RocketMQ出自 阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进。在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。为什么使用消息队列其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景转载 2021-08-26 21:32:57 · 675 阅读 · 0 评论 -
zookeeper节点类型详解
今天小编就为大家分享一篇关于zookeeper节点类型详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧1)Znode有两种类型:短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除 持久(persistent):客户端和服务器端断开连接后,创建的节点不删除2)Znode有四种形式的目录节点(默认是persistent )(1)持久化目录节点(PERSISTENT)客户端与zookeeper断开连接后,该节点依旧存..原创 2021-08-25 21:00:41 · 1868 阅读 · 0 评论 -
单个索引与联合索引
联合索引和单个索引的区别:如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了:(area,age,salary),(area,age)、(area)三个索引,这被称为最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。例:select * from test where area='11'select * from test where area='11' and age=1select * from test原创 2021-08-25 20:46:54 · 2012 阅读 · 0 评论 -
CentOS 7 开放防火墙端口 命令
最近公司新的server要求用CentOS7, 发现以前CentOS 6 系列中的 iptables 相关命令不能用了,查了下,发现Centos 7使用firewalld代替了原来的iptables。使用方法如下:>>> 关闭防火墙systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启动...原创 2021-07-05 17:09:59 · 397 阅读 · 1 评论 -
rabbitmq的延迟消息队列实现
第一部分:延迟消息的实现原理和知识点使用RabbitMQ来实现延迟任务必须先了解RabbitMQ的两个概念:消息的TTL和死信Exchange,通过这两者的组合来实现上述需求。消息的TTL(Time To Live)消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。如果队列设置了,消息也设置了,那么会取小的。所以一个消息如果被路由到不原创 2021-06-29 18:08:54 · 1697 阅读 · 1 评论 -
linux命令用来查看日志关键字
1、查看日志前 n行: cat 文件名 | head -n 数量 demo: cat test.log | head -n 200 # 查看test.log前200行2、查看日志尾 n行: cat 文件名 | tail -n 数量 demo: cat test.log | tail -n 200 # 查看test.log倒数200行3、根据关键词查看日志 并返回关键词所在行: 方法一:cat 路径/文件名 | grep 关键词 ...原创 2021-06-29 17:40:38 · 1118 阅读 · 0 评论 -
Netty原理-Reactor
1.原生 NIO 存在的问题NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、 SocketChannel、ByteBuffer等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须 对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥 塞和异常流的处理等等。 JDK NI原创 2021-06-29 13:55:45 · 461 阅读 · 0 评论 -
BIO、NIO、AIO的区别和原理
一、IO模型的知识JAVA BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程并处理,如果这个连接不做任何事情会造成不必要的开销,当然可以通过线程池机制改善JAVA NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理JAVA AIO(NIO2):异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应原创 2021-06-29 12:23:09 · 1167 阅读 · 7 评论 -
《RabbitMQ》如何保证消息不被重复消费
一 重复消息为什么会出现消息重复?消息重复的原因有两个:1.生产时消息重复,2.消费时消息重复。1.1 生产时消息重复由于生产者发送消息给MQ,在MQ确认的时候出现了网络波动,生产者没有收到确认,实际上MQ已经接收到了消息。这时候生产者就会重新发送一遍这条消息。生产者中如果消息未被确认,或确认失败,我们可以使用定时任务+(redis/db)来进行消息重试。@Component@Slf4Jpublic class SendMessage { @Autowired pr原创 2021-06-11 16:14:19 · 384 阅读 · 1 评论 -
Radis内存淘汰机制和过期策略
Key的过期策略Redis的Key有3种过期删除策略,具体如下:1. 定时删除原理:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作 优点:能够很及时的删除过期的Key,能够最大限度的节约内存 缺点:对CPU时间不友好,如果过期的Key比较多时,可能会占用相当一部分CPU时间,对服务器的响应时间和吞吐量造成影响2. 惰性删除原理:在取出键时才对键进行过期检查,如果发现过期了就会被删除 优点:对CPU友好,能够最大限度的节约C原创 2020-12-16 16:03:24 · 419 阅读 · 0 评论 -
RabbitMQ如何保证消息不被重复消费
想想为什么要使用MQ?1.解耦,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!2.异步,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度3.削峰,并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常使用了消息队列会有什么缺点?1.系统可用性降低:你想啊,本来其他系统只要运行好好的,那你的系统就是正常的。现在你非要加个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性降低2.系统复杂性增加:要多原创 2020-12-16 15:33:36 · 4064 阅读 · 0 评论 -
SpringBoot actuator 应用监控
一:初识actuatoractuator是SpringBoot的一个组件,组件名称为:spring-boot-starter-actuator, 引入方式如下:application配置文件:#actuatormanagement.security.enabled= falseendpoints.health.sensitive= falsemaven引入:<dependency> <groupId>org.springframework.boot&l原创 2020-12-16 14:13:51 · 585 阅读 · 1 评论 -
jvm性能调优
一、JVM内存模型及垃圾收集算法1.根据Java虚拟机规范,JVM将内存划分为:New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize等参数调整其大小。年轻代(New):年轻代用来存放JVM刚分配的Java对象 年老代(Tenured):年轻代中经过垃圾回收没有回收...原创 2020-12-16 11:25:45 · 352 阅读 · 0 评论 -
Spring Boot 最核心的 25 个注解
学习和应用 Spring Boot 有一些时间了,你们对 Spring Boot 注解了解有多少呢?今天栈长我给大家整理了 Spring Boot 最核心的 25 个注解,都是干货!1、@SpringBootApplication这是 Spring Boot 最最最核心的注解,用在 Spring Boot 主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。其实这个注解就是@SpringBootConfiguration、@EnableAut...原创 2020-12-15 20:54:42 · 227 阅读 · 0 评论 -
spingCloud 技术组成
重点:基于 Spring Boot云服务、分布式框架集合(众多)核心功能:分布式/版本化配置服务注册和发现路由服务和服务之间的调用负载均衡断路器分布式消息传递流程:请求统一通过 API 网关(Zuul)来访问内部服务。 网关接收到请求后,从注册中心(Eureka)获取可用服务。 由 Ribbon 进行均衡负载后,分发到后端具体实例。 微服务之间通过 Feign 进行通信处理业务。 Hystrix 负责处理服务超时熔断。 Turbine 监控服务间的调用和熔断...原创 2020-12-04 12:03:16 · 372 阅读 · 0 评论 -
RTMP 协议
一、概述RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。RTMP协议从属于应用层,被设计用来在适合的传输协议(如TCP)上复用和打包多媒体传输流(如音频、视频和互动内容)。RTMP提供了一套全双工的可靠的多路复用消息服务,类似于TCP协议[RFC0793],用来在一对结点之间并行传输带时间戳的音频流,视频流,数据原创 2020-12-04 10:21:45 · 1491 阅读 · 0 评论 -
java字节码技术
什么是java字节码技术 Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。因此,也可以看出字节码对于Java生态的重要性。之所以被称之为字节码,是因为字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取。在Java中一般是用javac命令编译源代码为字节码文件,一个.java文件从编译到运行的示例如图1所示。字节码技术应用场景AO...原创 2020-08-08 15:01:20 · 1273 阅读 · 0 评论 -
java垃圾回收器
一、Java有四种类型的垃圾回收器串行垃圾回收器(Serial Garbage Collector) 并行垃圾回收器(Parallel Garbage Collector) 并发标记扫描垃圾回收器(CMS Garbage Collector) G1垃圾回收器(G1 Garbage Collector)每种类型都有自己的优势与劣势。重要的是,我们编程的时候可以通过JVM选择垃圾回收器类型。我们通过向JVM传递参数进行选择。每种类型在很大程度上有 所不同并且可以为我们提供完全不同的应用程序性能.原创 2020-08-06 13:56:57 · 526 阅读 · 0 评论 -
并发编程--Disruptor框架
Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作;它是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式的实现,或者事件监听模式的实现;它是基于使用CAS机制实现的。CAS:Compare And Swap/Set 顾名思义比较和交换CPU级别的指令,cpu去更新一个值,但如果跟新过程中值发生了变化,操作就失败,然后重试,直到更新成功!Disruptor的seque原创 2020-07-20 14:11:30 · 305 阅读 · 0 评论 -
CPU密集型 vs IO密集型
CPU密集型(CPU-bound)CPU密集型线程的作用是进行无阻塞的逻辑运算的线程。比如:RPG游戏中的游戏逻辑服务器(也叫地图服务器)里面的主逻辑线程,这个主逻辑线程需要进行大量的无阻塞的逻辑处理。当被操作系统内核调度的时候,这个线程就在给定的CPU执行时间内进行无阻塞的操作。如果这个游戏逻辑服务器还创建更多的线程来进行逻辑操作的话,这样的行为是得不尝失的。因为,本进程的线程越多,而本进程获取的CPU执行时间又是固定的,导致了进程内每个线程的执行时间很短。所以,像游戏逻辑服务器中的线程应该属于CPU密原创 2020-07-11 16:09:02 · 1288 阅读 · 0 评论 -
设计模式的六大原则
一、单一职责原则 Single Responsibility Principle,应该有且仅有一个原因引起类的变更,实际中比较不好把握,因为职责的划分没有一个统一的标准。 二、里氏替换原则 Liskov Substitution Principle,通俗点讲,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。 三、依赖倒置原则 Dependence I.原创 2020-07-09 16:15:22 · 345 阅读 · 0 评论 -
线程池简介
线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。 线程池的工作机制: 在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的...原创 2020-06-06 08:17:14 · 244 阅读 · 0 评论 -
进程与线程
进程 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程具有的特征:动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;并发性:任何进程都可以同其他进行一起并发执行;独立性:进程是系统进行资源分配和调度的一个独立单位;结构性:进程由程序,数据和进程控制块三部分组成线程 随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序...原创 2020-05-20 13:15:36 · 279 阅读 · 0 评论 -
线程的状态及join方法
线程运行状态包括新建状态、就绪状态、运行状态、阻塞状态及死亡状态。New (新创建) 当用new操作符创建一个线程时,如new Thread(r),该线程还没有开始运行。这意味它的状态是new。此时程序还没有开始运行线程中的代码,在线程运行之前还有一些基础工作要做。Runnable (可运行/就绪) 一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法(如图中1所示)即启动了线程,start()方法创建线程运行的系统资源,并调度原创 2020-05-20 14:51:09 · 1910 阅读 · 0 评论 -
多媒体媒体分类
媒体的概念范围相当广泛,按照国际电话电报咨询委员会(Consultative Committee on International Telephone and Telegraph,CCITT)的定义,媒体可以分为如下5类。(1)感觉媒体(Perception Medium):指直接作用于人的感觉器官,使人产生直接感觉的媒体。如引起听觉反应的声音,引起视觉反应的图像等。(2)表示媒体(r...原创 2020-04-15 14:10:45 · 3394 阅读 · 0 评论 -
结构化布线子系统
结构化布线分为6个子系统:工作区子系统(Work Location):是由终端设备到信息插座的整个区域。一个独立的需要安装终端设备的区域划分为一个工作区。工作区应支持电话、数据终端、计算机、 电视机、监视器以及传感器等多种终端设备。水平子系统(Horizontal):各个楼层接线间的配线架到工作区f息插座之间所安装的线缆属于水平子系统。水平子系统的作用是将干线子系统线路延伸到用户工作区。...原创 2020-04-07 15:44:01 · 1201 阅读 · 0 评论 -
线性规划问题
线性规划的可行解域是由一组线性约束条件形成的,从几何意义来说,就是由一些线性解面围割形成的区域。由于线性规划的目标函数也是线性的,因此,目标函数的等值域是线性区域。如果在可行解域中的某内点处目标函数达到最优值,则通过该内点的目标函数等值域与可行解域边界的交点也能达到最优解。所以,第一步的结论是:最优解必然会在可行解域的边界处达到。由于目标函数的各个等值域是平行的,而且目标函数的值将随着该等值域向某...原创 2020-04-07 11:07:51 · 3032 阅读 · 0 评论 -
敏捷开发方法之Scrum
介绍Scrum 是一个增量的、迭代的敏捷软件开发过程。某软件公司计划开发一个基于Web的 Scrum项目管理系统,用于支持项目团队采用Scrum敏捷开发方法进行软件开发,辅助主管智能决策。此项目管理系统提供的主要服务包括项目团队的管理、敏捷开发过程管理和工件的管理。 Scrum敏捷开发中,项目团队由Scrum主管、产品负责人和开发团队人员三种不同的角色组成,其开发过程由若干个Sp...原创 2020-04-03 11:12:30 · 1519 阅读 · 0 评论 -
信息技术软件生存周期过程
在GBT8566—2007(信息技术软件生存周期过程)标准中,软件生存周期的基本过程包括五个,分别是获取过程、供应过程、开发过程、运作过程、维护过程。其中获取过程是为获取系统、软件产品或软件服务的组织即需方而定义的活动;供应过程是为向需方提供系统、软件产品或软件服务的组织即供方定义的活动;开发过程是为定义并开发软件产品的组织即开发方而定义的活动;运作过程是为在规定的环境中为其用...原创 2020-03-30 15:33:50 · 2260 阅读 · 0 评论 -
多核处理器介绍
多核是多微处理器核的简称,是将两个或更多的独立处理器封装在一起,集成在一个电路中。多核处理器是单枚芯片(也称为硅核),能够直接插入单一的处理器插槽中,但操作系统会利用所有相关的资源,将它的每个执行内核作为分立的逻辑处理器。通过在多个执行内核之间划分任务,多核处理器可在特定的时钟周期内执行更多任务。多线程是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同...原创 2020-03-24 11:18:22 · 8309 阅读 · 0 评论 -
利用开源软件搭建JAVA工程CI&CD自动化工具链(K8S)
JAVA传统项目交付流程的问题开发和运维间环境有明显差异 代码缺乏统一质量度量 客户要求上线时间紧,人工测试慢,导致测试不充分,时常做线上BUG修复打造工具链源码管理Gitlab 持续集成Jenkins 代码扫描SonarQube 接口测试PostMan+NewMan 制品管理ArtifactoryOSS版本(仅支持Maven) 自动部署AnsibleGi...转载 2020-03-16 17:24:15 · 796 阅读 · 0 评论 -
网络技术的选择考虑哪些因素?
根据用户需求选择网络技术时应考虑如下因素:①通信带宽。所选择的网络技术必须保证足够的带宽,能够保证用户快速地访问应用系统。在进行选择时,不仅局限于现有的应用需求,还要适当考虑将来的带宽增长需求。②技术成熟性。所选择的网络技术必须是成熟稳定的技术,有些新的网络技术在尚没有大规模投入使用时,还存在着较多不确定因素,这将会给网络建设带来很多无法估量的损失。对于大型网络工程来说,项目本身不能成为新...原创 2020-03-13 10:15:29 · 2611 阅读 · 0 评论 -
Kafka与RabbitMQ的区别
作为消息队列来说,企业中选择mq的还是多数,因为像Rabbit,Rocket等mq中间件都属于很成熟的产品,性能一般但可靠性较强,而kafka原本设计的初衷是日志统计分析,现在基于大数据的背景下也可以做运营数据的分析统计,而redis的主要场景是内存数据库,作为消息队列来说可靠性太差,而且速度太依赖网络IO,在服务器本机上的速度较快,且容易出现数据堆积的问题,在比较轻量的场合下能够适用。Ra...原创 2020-03-12 17:24:10 · 8013 阅读 · 0 评论 -
数据库的三级模式结构
数据库的三级模式结构中,视图对应外模式、基本表对应模式、存储文件对应内模式。数据库系统在三级模式之间提供了两级映像:模式/内模式映像、外模式/模式映像。正因为这两级映像保证了数据库中的数据具有较髙的逻辑独立性和物理独立性。①外模式/模式的映像:存在于外部级和概念级之间,实现了外模式到概念模式之间的相互转换。数据的逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的。数据的逻辑结构发生...原创 2020-03-11 10:25:37 · 3736 阅读 · 0 评论 -
螺旋模型与增量模型
1988年,Barry Boehm正式发表了软件系统开发的“螺旋模型”,它将瀑布模型和快速原型模型结合起来,强调了其他模型所忽视的风险分析,特别适合于大型复杂的系统。螺旋模型由风险驱动,强调可选方案和约束条件从而支持软件的重用,有助于将软件质量作为特殊目标融入产品开发之中。但是,螺旋模型也有一定的限制条件,具体如下:①螺旋模型强调风险分析,但要求许多客户接受和相信这种分析,并做出相关反应是...原创 2020-03-10 14:52:01 · 3940 阅读 · 0 评论 -
敏捷开发原则及方法
敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。敏捷开发的原则包括:①最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。②即使到了开发的后期,也欢迎改变需求。敏捷过...原创 2020-03-10 11:41:28 · 3634 阅读 · 0 评论 -
软件质量保证和软件配置管理
对于软件开发项目而言,控制是十分重要的管理活动。软件质量保证 (Software Quality Insurance, SQA)是在软件过程中的每一步都进行的“保护性活动”。SQA主要由基于非执行的测试(也称为评审)、基于执行的测试(即通常所说的测试) 和程序正确性证明。软件评审是最为重要的SQA活动之一。它的作用是,在发现及改正错误的成本相对较小时就及时发现并排除错误。审查和走查是进...原创 2020-03-10 11:31:34 · 2069 阅读 · 0 评论 -
I/O设备和CPU之间数据传送控制方式
常用的I/O设备和CPU之间数据传送控制方式有4种,分别为程序直接控制方式、中断控制方式、DMA方式和通道方式。程序直接控制方式和中断控制方式都只适用于简单的、外设很少的计算机系统,因为程序直接控制方式耗费大量的CPU时间,而且无法检测发现设备或其他硬件产生的错误,设备与CPU、设备与设备只能串行工作。中断控制方式虽然在某种程度上解决了上述问题,但由于中断次数多,因而CPU仍需要花费较多的...原创 2020-03-10 11:21:01 · 12760 阅读 · 0 评论