大明哥 大明哥

程序员、死磕 Java 创始人

死磕 Java 大明哥精心打造的 Java 进阶类系列教程,希望大家少走弯路。 更多死磕系列

  • Java现在发布的版本很快,每年两个,但是真正会被大规模使用的是3年一个的LTS版本。每3年发布一个LTS(Long-TermSupport),长期维护版本。意味着只有Java8,Java11,Java17,Java21才可能被大规模使用。每年发布两个正式版本,分别是3月份和9月份。在Java版本中,一个特性的发布都会经历孵化阶段、预览阶段和正式版本。其中孵化和预览可能会跨越多个Java版本。所以大明哥在介绍Java新特性时采用如下这种策略:每个版本的新特性,大明哥都会做一个简单的概述。单独出文介绍跟编码相关的新特性,一些如JVM、性能优化的新特性不单独出文介绍。孵化阶段的新特性不出文介绍。首

    2023-12-24
    阅读(1265)
  • 又到年底了,又是好多小伙伴主动或者被动找工作的时候了,最近好多小伙伴,都问我有没有最新面试题,有!!肯定有!!我就把我看过的和整理过的面试题,以答案都整理好,整理了目前最新版的《互联网大厂面试题》,涵盖了所有的Java面试题,并且为了各位小伙伴更好地有针对性地刷题,大明哥按照技术类别将面试题分了类,包括:Java基础、Java并发、Spring、SpringBoot、设计模式、Redis、Kafka等等共25个分类,99个PDF文件。面试题:25个文件夹99个PDF,包括Java集合、JVM、多线程、并发编程、设计模式、Java、MyBatis、ZooKeeper、Dubbo、Elastics

    2023-12-06
    阅读(910)
  • 上一个死磕Java专栏【死磕NIO】(当然写的不是很好,争取今年将它重写一遍)是**【死磕Netty】**的铺垫,对于我们Java程序员而言,我们在实际开发过程一般都不会直接使用JavaNIO作为我们的网络编程框架,因为写出一套高质量的JavaNIO程序并不是一件容易的事,除了JavaNIO固有的复杂性和bug之外,作为NIO服务端,我们要处理的事情太多了,如网络闪断、客户端认证、消息编解码、半包读写,客户端一样也有很多复杂的事情要处理,所以如果我们对JavaNIO没有足够了解,没有足够的网络编程经验的话,利用JavaNIO来编写一个高性能的稳定网络编程框架并不是一件容易的事。所以我们一般都不

    2023-10-06
    阅读(1406)
  • Git1、IDEA中配置Git选择File→Settings打开设置窗口,找到VersionControl下的Git选项,然后配置Git路径。如果Git安装在默认路径下,IDEA可以自动找到。选择路径后点击右侧Test,出现版本号提示即可【由于IDEA版本问题,提示的方式可能不一致】。2、将本地项目推送到远程仓库2.1、创建项目远程仓库这个使用GitHub位例,创建仓库spring_boot_test。如下图所示:2.2、初始化本地仓库创建完远程仓库之后,还要通过IDEA开发工具来初始化一个本地仓库,相比于GitBash这样的命令行来说,IDEA非常方便可以进行可视化的Git管理。如下图所示,

    2024-04-10
    阅读(11)
  • Git&GitHub1、将内容Push到GitHub上1.1、在GitHub上创建新项目要上传文件到GitHub,需要先在上面创建一个新的项目。首先在GitHub网站的右上角单击+按钮,在弹出的下拉列表中选择Newrepository选项:![202404102035343651.png][]接着填写项目名称:Repositoryname可任意填写,只要不重复即可可填写仓库描述存取权限选中Public单选按钮,可免费使用,选中Private则需交费$7/月可选是否添加readme文件可选根据语言的.gitignore忽略文件可选开源协议![202404102035347772.png]

    2024-04-10
    阅读(7)
  • Git标签1、概述1.1、标签是什么在Git中,标签(Tag)是一个指向某个Commit的指示标。这看起来好像与分支(Branch)一样,但又有一些不太一样的地方”。1.2、什么时候使用标签通常开发软件时会完成特定的“里程碑”,如软件版号1.0.0或beta-release之类的,这时就很适合使用标签做标记。1.3、标签的分类标签有两种:一种是轻量标签(lightweighttag)一种是有附注的标签(annotatedtag)不管是哪一种标签,都可以把它当作贴纸,贴在某个Commit上。”2、轻量标签(lightweighttag)轻量标签的使用方法相当简单,只需直接指定要贴上去的那个Com

    2024-04-10
    阅读(8)
  • Git1、修改历史信息要修改历史信息,可使用--amend参数来修改最后一次Commit的信息,但这仅限于最后一次,如果要改动其他更早的信息,就得使用其他方法了。前面介绍过的gitrebase指令有一种强大的互动模式,接下来的几节内容都是介绍怎样使用这种模式来改动过去的历史记录。首先看一下当前的状况:gitlog--oneline1.1、启动互动模式下面使用Rebase指令整理一下:gitrebase-i4cb958a-i参数是指要进入Rebase指令的“互动模式”,而后面的4cb958a是指这次Rebase指令的应用范围为“从现在到4cb958a这个Commit”,也就是最开始的那个Comm

    2024-04-10
    阅读(7)
  • Git分支1、开始使用分支在Git中使用分支很简单,只要使用gitbranch命令即可:gitbranch如果gitbranch后面没有接任何参数,它仅会输出当前在这个项目中有哪些分支。Git默认会设置一个名为master的分支,前面的星号(*)表示现在正在这个分支上。1.1、新增分支要增加一个分支,可在执行gitbranch命令时,在后面加上想要的分支的名称:gitbranchcat这样就新增了一个cat分支。再查看一下:gitbranch可以看出,的确多了一个分支,但当前分支还是在master上。1.2、更改分支名称如果觉得分支名取得不够响亮,可以随时更改,而且不会影响文件或目录。假设现在

    2024-04-10
    阅读(9)
  • Git1、开始版本控制1.1、初始化Repository新建一个目录,并使用gitinit命令初始化Repository:mkdirmygitgitinitgitinit命令会在mygit目录中创建一个.git目录。1.2、使目录脱离Git控制Git的版控很单纯,全都是靠.git目录在做事。如果这个目录不想被版控,或者只想给客户不含版控记录的内容,只要把.git目录移除,Git就对这个目录失去控制权了。2、把文件交给Git管控2.1、创建文件后交给Git创建一个内容为"hell,git"的文件,并命名为welcome.html:echo"hello,git&quo

    2024-04-10
    阅读(10)
  • IDEA创建项目并托管到GitHub步骤步骤1:创建项目步骤2:首先在github创建一个仓库步骤3:制定仓库名称步骤4:创建成功,得到git地址步骤5:接着在本地创建一个项目步骤6:建立本地仓库步骤7:把项目加入到本地仓库步骤8:提交项目步骤9:PushCommit步骤10:查看github1.创建项目2.在GitHub上创建一个仓库首先登陆github.com然后点击右上角账号左边的加号,点击Newrepository创建仓库。Git上仓库就相当于项目的意思3.指定仓库名称一般与项目名称相同4.创建成功,得到git地址得到github地址:https://github.com/how2j/

    2024-04-10
    阅读(9)
  • 提交修改代码随意修改一下代码:提交改动使用快捷键CTRL+K,就会弹出提交的界面,点击CommitandPush即可在Git上查看更新的改动更新使用快捷键CTRL+T,就会弹出更新的界面,点击OK即可。

    2024-04-10
    阅读(9)
  • pull项目checkoutFile->VCS->CheckoutfromVersionControl->GitHub输入项目参数GitRepositorURL:https://github.com/xxxxx.xxx.gitParentDirectory:e:\projectDirectoryName:higit然后点击Clone结果

    2024-04-10
    阅读(8)
  • IDEA配置Git为IDEA指定Git路径默认情况下,IDEA是不自带git运行程序的,所以需要通过File->settings->VersionControl->Git->PathtoGitexecutable:设置为安装Git中所安装的git.ext设置GitHub账号File->settings->VersionControl->GitHub->CreateAPIToken

    2024-04-10
    阅读(7)
  • Git工作流概念在项目开发过程中使用Git的方式分类集中式工作流像SVN一样,集中式工作流以中央仓库作为项目所有修改的单点实体。所有修改都提交到Master这个分支上。这种方式与SVN的主要区别就是开发人员有本地库。Git很多特性并没有用到。GitFlow工作流Gitflow工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。Forking工作流Forking工作流是在GitFlow基础上,充分利用了Git和Fork和pullrequest的功能以达到代码审核的目的。更适合安全可靠地管理打团队的开发者,而且能接受不信任

    2024-04-10
    阅读(8)
  • OxygenEclipseimport导入工程到远程库复制工程地址指定工程的保存位置指定工程的导入方式,这里只能用:Importasgeneralproject转换工程类型最终效果KeplerEclipse克隆工程操作问题:不能保存到当前Eclipse工作区目录正确做法:保存到工作区以外的目录中解决冲突冲突文件->右键->Team->MergeTool修改完成后正常执行add/commit操作即可

    2024-04-10
    阅读(7)
  • 工程初始化为本地库工程->右键->Team->ShareProject->Git-CreateRepositoryFinishEclipse中忽略文件概念Eclipse特定文件,都是Eclipse为了管理工程而维护的文件,和开发的代码没有直接关系。最好不要在Git中进行追踪,也就是把它们忽略。.classpath文件.project文件.settings目录下所有文件GitHub官网样例文件官网示例Java示例编辑本地忽略配置文件,文件名任意==在~/.gitconfig文件中引入上述文件[core]excludesfile=C:/Users/Lenovo/Java.g

    2024-04-10
    阅读(8)
  • SSH登录进入当前用户的家目录$cd~删除.ssh目录$rm-rvf.ssh运行命令生成.ssh密钥目录$ssh-keygen-trsa-Catguigu2018ybuq@aliyun.com[注意:这里-C这个参数为大写的C]进入.ssh目录查看文件列表$cd.ssh$ls-LF查看id_rsa.pub文件内容$catid_rsa.pub复制id_rsa.pub文件内容,登录GitHub,点击用户头像->Settings->SSHandGPGkeysNewSSHKey输入复制的密钥信息回到Gitbash创建远程地址别名gitremoteaddorigin_ssh@github.c

    2024-04-10
    阅读(10)
  • 创建远程库地址别名#查看当前所有远程地址别名gitremote-vgitremoteadd[别名][远程地址]推送gitpush[别名][分支名]克隆gitorigin[远程地址]效果:完整的把远程库下载到本地创建origin远程地址别名初始化本地库团队成员邀请“岳不群”其他方式把邀请链接发送给“令狐冲”,“令狐冲”登录自己的GitHub账号,访问邀请链接。拉取pull=fetch+mergegitfetch[远程库地址别名][远程分支名]gitmerge[远程库地址别名/远程分支名]gitpull[远程库地址别名][远程分支名]解决冲突要点如果不是基于GitHub远程库的最新版做的修改,不能

    2024-04-10
    阅读(9)
  • 基本原理哈希哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密长度固定。哈希算法确定,输入数据确定,输出数据能够保证不变。哈希算法不可逆Git底层采用的是SHA-1算法哈希算法可以被用来验证文件。原理如下图所示:Git就是靠这种机制来从根本上保证数据完整性的。Git保存版本的机制集中式版本控制工具的文件管理机制以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和文件随时间逐步累积的差异。Git的文件管理机制Git把数据看作是小型文件系统的一组快照。每次提交更新时Git都会对当前的全

    2024-04-10
    阅读(11)
  • 分支操作什么是分支在版本控制过程中,使用多条线同时推进多个任务。查看所有分支gitbranch-v创建分支gitbranch[分支名字]切换分支gitcheckout[分支名]分支合并第一步:切换到接受修改的分支上(被合并,增加新内容)gitcheckout[被合并分支名]第二步:执行merge命令gitmerge[有新内容的分支名]解决冲突冲突的表现冲突的解决第一步:编辑文件,删除特殊符号第二步:把文件修改到满意的程度,保存退出第三步:gitadd[文件名]第四步:gitcommit-m“日志信息”注意:此时commit一定不能带具体文件名

    2024-04-10
    阅读(9)
  • 查看历史记录#命令gitlog#多屏显示控制方式空格向下翻页b向上翻页q退出#每条日志显示一行gitlog--pretty=oneline#只显示一部分Hash值gitlog--oneline#HEAD@{移动到当前版本需要多少步}gitreflog版本的前进和后退基于索引值的操作gitreset--hard[局部索引值]gitreset--harda6ace91使用^符号:只能后退gitreset--hardHEAD^注:一个^表示后退一步,n个表示后退n步使用~符号:只能后退gitreset--hardHEAD~n注:表示后退n步reset命令的三个参数对比soft参数仅仅在本地库移动HE

    2024-04-10
    阅读(6)
  • 使用远程仓库的目的作用:备份,实现代码共享集中化管理Git克隆操作目的将远程仓库(github对应的项目)复制到本地将本地仓库同步到git远程仓库中为什么无法同步或没有权限TherequestedURLreturnederror:403Forbiddenwhileaccessing答案:私有项目,没有权限,输入用户名密码,或者远程地址采用这种类型:vi.git/config#将[remote"origin"]url=https://github.com/用户名/仓库名.git修改为:[remote"origin"]url=https://用户名:密码@g

    2024-04-10
    阅读(10)
  • 基本工作流程Git工作区域向仓库中添加文件流程初始化及仓库创建和操作基本信息设置1.设置用户名gitconfig--globaluser.name'用户名'2.设置用户名邮箱gitconfig--globaluser.email'邮箱'注意:该设置在github显示谁提交了该文件初始化一个新的Git仓库创建文件夹在文件内初始化git(创建git仓库)cdtestgitinit向仓库添加文件修改仓库文件删除仓库文件

    2024-04-10
    阅读(9)
  • 个人主页收藏(Star)操作:打开对应项目主页,点击右上角star按钮即可收藏情景:张三无意访问到李四的开源项目感觉不错并进行收藏查看自己得收藏关注(Watch)情景:张三关注了李四的项目,李四添加项目文件,张三的github主页会有怎样的展示?复制克隆项目(Fork)情景:张三fork了李四的项目,相当于张三复制了李四的项目,所以自己也单独有了一个一样名称的仓库(注:该仓库会声明来自于李四,但是独立存在)︴验证:fork后的仓库是否单独存在发起请求(PullRequest)情景:张三修改了fork的项目中的文件,希望更新到原来的仓库,这时候他要新建一个pullrequestGit1发起一个更

    2024-04-10
    阅读(9)
  • GithubIssues作用:发现代码BUG,但是目前没有成型代码,需要讨论时用;或者使用开源项目出现问题时使用情景:张三发现李四开源git库,提交了一个issue;李四隔天登录在github主页看到通知并和张三交流,最后关闭issue

    2024-04-10
    阅读(8)
  • 创建仓库一个git库(仓库)对应一个开源项目通过git管理git库点击【Startaproject】创建一个仓库仓库主页说明仓库管理新建文件编辑文件删除文件查看删除文件信息点击commits按钮查看上传文件搜索仓库文件下载/检出项目

    2024-04-10
    阅读(7)
  • 什么是GitGit是一个免费、开源的版本控制软件什么是版本控制系统版本控制是一种记录一个或若干个文件内容变化,以便将来查阅特定版本修订情况得系统。系统具体功能记录文件的所有历史变化随时可恢复到任何一个历史状态多人协作开发或修改错误恢复什么是GithubGithub是全球最大的社交编程及代码托管网站(https://github.com/)。Github可以托管各种git库,并提供一个web界面(用户名.github.io/仓库名)Github和Git是什么关系Git是版本控制软件Github是项目代码托管的平台,借助git来管理项目代码仓库(Repository)仓库用来存放项目代码,每个项目

    2024-04-10
    阅读(8)
  • 1背景消息队列作为发布订阅模型的消息中间件广泛应用于上下游业务集成场景。在实际业务场景中,同一个主题下的消息往往会被多个不同的下游业务方处理,各下游的处理逻辑不同,只需要关注自身逻辑需要的消息子集。所以在消息中心和消费者之间,需要有一种消息过滤功能,可以帮助消费者更高效地过滤自己需要的消息集合,避免大量无效消息投递给消费者,降低下游系统处理压力。ApacheRocketMQ很好的支持了这一能力,它解决了单个业务域即同一个主题内不同消息子集的过滤问题。2关于消息过滤2.1概念在消费者订阅了某个主题后,ApacheRocketMQ会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息,可通

    2024-04-09
    阅读(16)
  • 1背景在互联网业务的实际应用场景中,消息的批量处理是非常必要的,因为我们时刻面临着大量数据的并发执行。例如,我们在一个业务交互的时候会有大量的分支行为需要异步去处理,但是这些动作又是在不同的业务粒度上的,所以我们需要多次调用MQ写入消息,可能有多次的连接和消息发送。这个写MySQL数据库是一样的,多次建连和写入,跟一次建连和批量数据库,性能是完全不能比的。所以我们需要有MQ有批量消息的能力来对我们的业务数据进行快速处理。2批量消息实现过程RocketMQ的批量消息,可以提高消息的吞吐能力和处理效率,降低下游系统的API调用频率,同时对消息服务的稳定性也有帮助。2.1批量消息的特点批量消息具有相

    2024-04-09
    阅读(15)
  • 1背景在互联网业务的实际应用场景中,消息的延时处理是非常必要的。例如,在金融交易系统中,某些交易的确认可能需要一段时间才能完成。又如,在物流跟踪系统中,货物的运输状态需要一段时间才能更新。而MQ作为中间件的角色专门来处理消息媒介,实际也具备了使用消息的延时处理来保证信息的及时性的能力。这边举两个具体的例子:火车票订购,提交了订单就把车票给占位了,这时候可以发送一个延时确认的消息,15m未付款,就要把该车票释放,这样其他人就可以购买了。购买电影票,可以发送一个核销检查消息,在电影开场前15分钟就无法退票了。既然消息延迟处理的使用场景这么常见,那我们就要详细来分析下怎么使用MQ来实现,这边以Roc

    2024-04-09
    阅读(15)
  • 1背景我们在前面两个章节中,介绍了消息组件如何保证可靠性传输和顺序行消费,参考上面系列的11、12章节。比如在消息生产阶段,如何保证消息发出的稳定性和可靠性;在消息服务器处理阶段,如何保证消息从生产到发送出去,经过网络传输,再到达Broker服务器并被接收的这整个阶段的可靠性,即如何使用ACK机制来保证消息传递的可靠性;还有就是消息消费的可靠性,Broker作为消息服务器,消息接收并持久化消息并消费的整个过程的可靠性如何保障。对于消息队列组件来说,这几个步骤出现问题,都有可能造成消息队列无法进行正常运行,消息堆积的情况发生。另外一种情况可能就是突发的流量峰值,这种一般发生在某种消费促销活动或者

    2024-04-09
    阅读(15)
  • 1介绍消息的有序性在很多业务场景中占有很重要的位置。比如购物场景,需要按照创建订单-->订单付款-->完成订单顺序执行。又比如出行场景,接单-->接送到达目的地-->付款-->完成订单。这种是严格按照顺序执行的,这样的顺序消费才不会出问题,而且各个订单之间是互相独立和并行执行的。所以,在MQ中,如何稳定地保证顺序性消息处理,是一个不可避免的话题。2消息的有序性说明消息的有序执行,一般不是单个组件的能力。而是整个消息从生产,排队,存储到消费都是有序的,比如上面提到的购物和出行场景。这就要求我们在消息队列(如果是Kafka,还是RocketMQ、RabbitMQ)中,

    2024-04-09
    阅读(16)
  • 1介绍这篇我们来说说MQ消息的可靠性传输。可靠性传输其实包含两种情况:一种是重复消费的情况,我们上一篇的幂等性消费解决的就是这个问题;另外一种是消息丢失的情况的,要确保我们生产的消息一定最终会得到消费。这时候就要从消息执行的几个阶段去保证,每一个阶段都不能出现问题。2消息生产阶段消息生产阶段指的是消息从生产到消息发送出去,经过网络传输,再到达Broker服务器并被接收的这整个阶段,我们需要一个健壮的确认机制(ACK)来保证消息传递的可靠性。如果说消息被接收到之后可以反馈给消息生产方去确认,那这个过程就比较完美了。消息创建和发送事务性原则保证,要么成功,要么不成功同步发送时,处理好返回值,如果发

    2024-04-09
    阅读(15)
  • 1介绍我们实际系统中有很多操作,不管你执行多少次,都应该产生一样的效果或返回一样的结果。例如:前端页面重复提交选中的数据,服务端只产生对应这个数据的一个反应结果,只保存一次数据。我们发起一笔付款请求,也只能扣用户账户一次钱,即使遇到网络重发或系统bug重发,也应该只扣一次金额。消息通知,也应该只能收到一次,如果收到多次的扣款通知短信,会让用户误解的。创建商品订单,一次业务请求只能创建一个,创建多个就会变成购买多次,就会出问题。以上等等很多重要的场景,都需要幂等的特性来支持。幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中.一个幂等操作的特

    2024-04-09
    阅读(15)
  • 1介绍消息中间件是指在分布式系统中完成消息的发送和接收的基础软件。消息中间件也可以称消息队列(MessageQueue/MQ),互联网场景中经常使用消息中间件进行消息路由、订阅发布、异步处理等操作,来缓解系统的压力。引入消息队列主要是为了解决如下问题的:1、解耦:如订单系统,可以通过消息队列把削减库存的工作交给库存系统去处理,而不用等实时响应。2、执行有序性:先进先出原理,按照进入消息队列的顺序处理业务事件。3、消息路由:按照不同的规则,将队列中消息发送到不同的业务服务中。4、异步处理:将一些无需实时响应结果的计算放到异步中,提升系统的吞吐率。5、削峰:将峰值期间的操作削减,比如整个操作流程包

    2024-04-09
    阅读(16)
  • 1介绍在之前的章节中,我们介绍了消息的发送和消息通信的原理。但是这边有一个比较核心的关键点,那就是如果已经把消息传递给Broker。在Broker在被消费之前,如何保证消息的稳定性,避免消息丢失和数据。这时候就需要数据持久化数据来进行保障了。根据之前我们MQ系列2:消息中间件的技术选型章节做的分析,RabbitMQ支持1W+级别的吞吐,Kafka和Rocket支持10W+级别的吞吐,想要实现这么大的吞吐,必须具备一个很强悍的存储功能。下面我们来看看。2Broker存储架构RocketMQ采用文件存储机制(类似Kafka),即直接在磁盘上使用文件来保存消息,而不是采用Redis或者MySQL之类

    2024-04-09
    阅读(16)
  • 1介绍前面的章节我学习了NameServer的原理,消息的生产发送,以及消息的消费的全过程。我们来回顾一下:RocketMQ消息队列架构主要包括NameServe、Broker(Master/Slave)、Producer、Consumer4个核心部件,基本执行流程如下:NameServer优先启动。NameServer是整个RocketMQ的“中央大脑”,作为RocketMQ的服务注册中心,所以RocketMQ需要先启动NameServer再启动Rocket中的Broker。Broker启动后,需要将自己注册至NameServer中,并保持长连接,每30s发送一次发送心跳包,来确保Broke

    2024-04-09
    阅读(16)
  • 在之前的文章中,我们学习了RocketMQ的原理;RocketMQ中命名服务ServiceName的运行流程;以及消息生产、发送的原理和模式。这一篇,就让我们从消息消费的角度去进一步的学习。1消息消费消息的消费主要是由如下几个核心能力组成的:消费方式:Push(推)或者Pull(拉)消费模式:广播模式和集群模式消息消费反馈流量控制(包括消费并发线程数设置)消息的过滤(Tag,Key),过滤标签TagA||TagB||TagC1.1消费方式PushorPullRocketMQ消息订阅有方式:Push方式(MQPushConsumer),MQServer主动向消费端推送;这种模式不考虑消费端是否有

    2024-04-09
    阅读(14)
  • 在之前的篇章中,我们学习了RocketMQ的原理,以及RocketMQ中命名服务ServiceName的运行流程,本篇从消息的生产、消费来理解一条消息的生命周期。1消息生产在RocketMQ中,消息生产指的是消息生产者往消息队列中写入数据的过程。因为业务场景的复杂性,RocketMQ架构设计了多种不同的发送策略。下面先讨论几种常见的场景:同步发送:整个过程业务是阻塞等待的,消息发送之后等待Broker响应,得到响应结果之后再传递给业务线程。异步发送:调用RocketMQ的AsyncAPI,消息生产者只要把消息发送任务放进线程池就返回给业务线程。所有的逻辑处理、IO操作、网络请求都由线程池处理,

    2024-04-09
    阅读(15)
  • 1关于NameServer上一节的MQ系列3:RocketMQ架构分析,我们大致介绍了RocketMQ的基本组件构成,包括NameServer、Broker、Producer以及Consumer四部分。NameServer,指的是服务可以根据给定的名字来进行资源或对象的地址定位,并获取有关的属性信息。在Rocket中也一样,NameServer是RocketMQ的服务注册中心(类似于Kafka集群后面的Zookeeper集群一样,对集群元数据进行管理),根据元数据(ip、port和router信息)来唯一定位服务。RocketMQ需要先启动NameServer,再启动Rocket中的Broke

    2024-04-09
    阅读(13)
  • 1背景我们前面两篇对主流消息队列的基本构成和技术选型做了详细的分析。从本篇开始,我们会专注当下主流MQ之一的RocketMQ。从他的如下的几个方面去讨论:基础能力(如组织构成、消息发送、消息存储(持久化)、消息通信、消息消费)功能性方面(如消息堆积、消息回溯、消息追踪、消息过滤),高可用性方面(如消息顺序性保障、消息幂等性保障、消息安全性保障、消息事务性保障),性能方面(如时效性,单机吞吐率)参考MQ系列2:消息中间件的技术选型1.1RocketMQ是的基本组件构成RocketMQ主要有四大核心组成部分:NameServer、Broker、Producer以及Consumer四部分。NameS

    2024-04-09
    阅读(14)
  • 1背景在高并发、高消息吞吐的互联网场景中,我们经常会使用消息队列(MessageQueue)作为基础设施,在服务端架构中担当消息中转、消息削峰、事务异步处理等职能。对于那些不需要实时响应的的业务,我们都可以放在消息队列中进行传输。下面是用户在进行系统注册的时候场景,充分体现MQ的作用可以看到用户注册的过程步骤1+步骤2,从请求到响应总共耗时55ms。消息消费+短信发送的时间比较长,从上面看花了5s多,一般让消息队列服务去处理,用户静静等待短信送达即可。消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和

    2024-04-09
    阅读(15)
  • 1关于消息中间件1.1什么是消息中间件?消息中间件是指在分布式系统中完成消息的发送和接收的基础软件。消息中间件也可以称消息队列(MessageQueue/MQ),用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。简而言之,互联网场景中经常使用消息中间件进行消息路由、订阅发布、异步处理等操作,来缓解系统的压力。1.2它解决了我们哪些痛点?1、解耦:比如说系统A会交给系统B去处理一些事情,但是A不想直接跟B有关联,避免耦合太强,就可以通过在A,B中间加入消息队列,A将要任务的事情交给消息队列,B

    2024-04-09
    阅读(24)
  • 1微服务发展微服务架构的发展伴随着互联网行业的飞速增长和技术的日新月异。起初,企业为了提升应用的灵活性和可维护性,开始尝试将单体应用拆分为多个服务,这便是面向服务的架构(SOA)的兴起。然而,此时的拆分粒度仍然相对较大,并没有完全实现服务的细粒度划分。随着Docker和容器技术的兴起,微服务架构真正得到了发展的助力。容器技术为微服务提供了轻量级的隔离环境,使得微服务更容易部署和管理。每个微服务都可以独立运行、扩展和更新,大大提高了系统的灵活性和可维护性。进入云原生时代,伴随着Kubernetes等技术的兴起,微服务架构得到了更为完善的支撑。云原生技术为微服务提供了自动化部署、管理和监控的能力,

    2024-04-07
    阅读(26)
  • 1介绍互联网行业内在进行微服务高可用建设的时候,不可避免的要考虑一个事情,如何部署才能提高系统的可用性和稳定性。所以一般情况下,不会只部署一个机房,这样无法完全避免一个机房内网络故障、机房断电,遭受区域网络攻击的风险。所以有了多机房建设的,但是多机房建设同样也有问题,他们无法近距离的部署,如果部署区域太近(如在同一个城市),依然无法避免区域断电、洪灾、水灾、火灾、地震等灾难情况的发生。所以业内的大型互联网企业,会耗费大量的人力物理在基础设施建设方面。通过资源的冗余来保证服务的可持续性,这种其实就是资源博弈的过程。2高可用架构模型2.1两地安中心两地三中心是一种容灾解决方案,指的是一个生产中心、

    2024-04-07
    阅读(21)
  • 1介绍大家都知道,一个主机(或称为节点)可以部署多个Pod,Pod作为Kubernetes中的最小部署单元。是一组一个或多个紧密关联的容器的集合,它们共享相同的网络命名空间和存储卷。一般来说,服务上云之后,我们的服务会配置anti-affinity(反亲和调度),他有哪些利弊权衡呢:affinity可以实现就近部署,增强网络能力实现通信上的就近路由,减少网络的损耗。如同一个BCC聚类多个实例Pod。anti-affinity反亲和性主要是出于高可靠性考虑,尽量分散实例Pod,某个节点故障的时候,对应用的影响只是N分之一或者单实例。所以,最终的部署结构可能是:同一个服务(如ServiceA)的实

    2024-04-07
    阅读(19)
  • 1介绍在互联网电商场景中,我们经常会遇到有计划的流量洪峰,比如双11、618购物节,积分竞拍和定时抢购的疯狂场景。这种是在预期内的,知道会发生并有一定的准备。而那些预期之外的突发流量异常,才是真正给我们带来挑战的部分,比如:硬件故障:如服务器宕机,机房断电,光纤被挖断等。缓存击穿:一般发生在应用重启导致的缓存失效,以及短时间内大量缓存过期失效时。大量的无法命中,使请求直击后端服务,造成服务提供者超负荷运行,引起服务不可用。程序BUG:如程序逻辑导致内存泄漏;JVM长时间FullGC等。新功能上线:未经过评估,导致非预期流量上涨(某次功能上线,未进行有效的容量评估,导致ws长连接翻数倍)。单个服

    2024-04-07
    阅读(28)
  • 1介绍在复杂的互联网场景中,不可避免的会因为一些内在或者外在的因素,导致出现请求超时的情况。而典型的业务超时场景主要有如下:网络延迟或者抖动或者丢包,从而导致响应时间变长。容器甚至云主机资源瓶颈情况:如CPU使用率过高、内存使用是否正常、磁盘IO压力情况、网络时延情况等资源使用情况异常,也可能导致响应时间变长。负载均衡性问题:多实例下分配的流量不均衡,目前看云基础场景,这个情况不多见。突发洪峰请求:大部分对内的业务基本不存在非预期的流量,突发洪峰请求主要还是程序的调用不合理或者程序bug(内存泄露、循环调用、缓存击穿等)。单个Pod实例,长耗时容易造成队列堆积,对资源损耗很大,快速的释放或者调

    2024-04-07
    阅读(18)