精华内容
下载资源
问答
  • 推荐10个堪称神器的学习网站

    万次阅读 多人点赞 2020-01-07 10:27:26
    01、大学资源网 大学资源网是一个完全免费并且功能非常强大的学习网站,它免费提供了丰富并且全面的学习视频教程,并且视频课程一直在更新,非常良心。 我比较看重的是它里面的考研视频教程,有数学、英语、政治、...

    每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。”

    今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈)

    既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推荐给大家。如果觉得不错的话,文末请点赞。

    01、大学资源网

    大学资源网是一个完全免费并且功能非常强大的学习网站,它免费提供了丰富并且全面的学习视频教程,并且视频课程一直在更新,非常良心。

    我比较看重的是它里面的考研视频教程,有数学、英语、政治、专业课等等;还有英语视频课程,对于一名程序员来说,如果想要变得更优秀,英语是不可或缺的。

    另外,我看到它还贴心的支持:小学课程、初中课程、高中课程。挑了几个看了一下,竟然找到了年轻时上课的感觉。

    02、北京大学公开课

    北京大学公开课是北京大学出品的一个完全免费的公开课视频学习站,它面向大学生,也向社会大众免费开放。

    我比较喜欢的是里面的《数据结构与算法》,对于我们程序员来说,既然进入了专业的编程领域,算法、数据结构、网络模型、计算机原理等这些计算机科学专业的理论知识是必须要学习的。

    虽然算法很难,需要智商,但我还是要鼓励大家学一下,一旦掌握了其中的套路,你会受益无穷的。

    03、大学自学网

    大学自学网是一个完全免费的大学生自学网站,它不仅支持免费在线观看所有学习视频,还支持免费下载所有学习视频,是一个可以满足很多人自学需求的良心网站。

    向下拉,你会看到一个计算机板块,里面有“网络安全基础”、“嵌入式Linux操作系统”、“Python”等热门方向的视频。这些也是工作以后的刚需。

    我看里面还有一个“电脑安装与维修实用技术”,妈妈再也不用担心我不会给女朋友修电脑了,哈哈哈。

    04、偶书

    偶书是一个完全免费的精品电子书网站,它不仅支持电子书搜索下载,还支持非常全面的电子书分类功能和非常贴心的电子书推荐功能。

    下载了一本《Java编程思想》,质量还是挺不错的。另外,推荐大家空闲的时间可以读一读《代码大全》、《编程珠玑》、《重构》等等,偶书上都可以搜索到。

    05、哔哩哔哩

    bilibili 是国内知名的视频弹幕网站,通过动漫打出了名声,最近两年发展势头迅猛,里面有不少有创意的 Up 主,不乏一些有趣的程序员。

    看到我的好朋友【程序员良许】也在上面,我就知道 B 站上的视频质量越来越高了。顺带再推荐一些 up 主给大家,比如说小甲鱼(涉及到 C 语言、Python、Web 前端等)、技术胖(主攻 Web 前端,涉及到 React、Vue、Flutter 等等)。

    06、简单教程

    简单教程是一个完全免费的高质量编程开发学习网站。它提供了丰富的基础学习教程,包括:微信小游戏开发、移动开发、前端开发、后端开发、java 技术、.NET 、数据库和缓存、运维开发、XML 。

    如果是 Java 程序员的话,我建议大家先学一学《设计模式》。设计模式就好像是武功的招式,有了这些招式,加上一些内功,就能战无不胜了。

    07、Stack Overflow

    Stack Overflow 是一个世界级的问答网站,该网站允许注册用户提出或回答问题,还可以对已有问题或答案加分、扣分或进行修改,条件是用户达到一定的“声望值”。“声望值”就是用户进行网站互动时能获取的分数,例如,用户 A 回答了一个问题,用户 B 对用户 A 的解答给予了“加分”,用户 A 就会因而获得 10 点声望值。 当声望值达到某个程度,用户的权限就会增加,如声望值超过50点就可以评论答案,另外网站也会根据用户的贡献颁发徽章 。

    我最近坚持每周看一个问题,目前已经总结了很多个高浏览量的问题,感觉很多以前不解的问题都突然豁然开朗了,大家感兴趣的话,可以看一下我之前学习过的记录:打印Java数组最优雅的方式是什么?

    08、YouTube

    这个里面我比较喜欢的是 JavaPoint 的视频,观看量也比较大,内容讲解的也很实用和入门级,很适合初学者学习。每集差不多 10 分钟,强烈推荐。

    09、牛客网

    牛客网”是一个专注于程序员的学习和成长的专业平台,集笔面试系统、课程教育、社群交流、招聘内推于一体。

    说道面试题,肯定是面试之前要刷一刷,不少读者问我,想跳槽,但是又感觉不自信,那么我的回答只有一个,就是刷面试题啊。

    10、CSDN

    CSDN 是 1999 年成立的,算是国内最老,最成熟的技术博客网站了。虽然近年来被吐槽很多,比如说资料下载的问题,比如文章抄袭的问题,但是这并不妨碍 CSDN 能够帮助我们解决很多问题的现实。如果你搜解决方案的时候,无论是某度,还是谷歌,排名靠前的几乎都出自 CSDN。

    看到我的好朋友江南一点雨我就放心了,说明 CSDN 的推荐机制还没有出毛病。他的文章质量还是非常高的,在 Spring Boot 方面有着很专业的见解。

    好了,就推荐个大家这 10 个堪称神器的学习网站吧,用心地学上一年半载,你会回来感谢我的。人最重要的就是放下自己的偏见,以及开阔自己的眼界。干,就对了。

    最后,还有很多读者问我是怎么学习的,那我干脆就把我看过的一些优质书籍贡献出来:

    计算机基础入门推荐:《程序是怎样跑起来的》、《网络是怎样连接的》、《计算机是怎样跑起来的的》

    进一步认识计算机网络:《计算机网络:自顶向下》、《图解http》

    数据结构+算法入门:《大话数据结构》、《阿哈算法》

    算法进阶:《算法第四版》、《编程珠玑》

    由于我是 Java 技术栈的,顺便推荐几本 Java 的书籍,从左到由的顺序看到

    Java:《Java核心技术卷1》、《编程思想》、《深入理解Java虚拟机》、《effective Java》、《Java并发编程的艺术》

    数据库:《mysql必知必会》、《MySQL技术内幕:InnoDB存储引擎》

    就先介绍这么多,这些都是最基础最核心的,希望对那些不知道看什书的同学有所帮助。

    对了,我介绍的这些书籍,已经顺便帮你整理好了,你可以在我的原创微信公众号『沉默王二』回复『书籍』获取哦

    有收获?希望老铁们来个三连击,给更多的同学看到这篇文章

    1、老铁们,关注我的原创微信公众号「沉默王二」,专注于有趣有益的程序人生,保证你看完有所收获,不信你打我。

    2、给二哥点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。

    作者info
    作者:沉默王二,CSDN 2019年度博客之星,《Web全栈开发进阶之路》作者
    原创公众号:『沉默王二』,已写了 250 多篇文章,专注于有趣的 Java 技术和有益的程序人生,期待你的关注。

    展开全文
  • Unity-2D游戏开发套件指南-免费资源

    千次阅读 2019-10-09 11:53:06
    今年年初,Unity Brighton的内容团队推出了...本文将通过2D游戏开发套件中的游戏示例项目,来带领大家走进2D游戏开发的世界。游戏内容是,我们的首席工程Ellen的飞船坠落在一个古老神秘的外星星球,必须避免危险...

    目录

    项目介绍

    创建新场景

    绘制关卡

    测试关卡

    添加移动平台

    使用事件触发开门动作

    敌人

    摧毁敌人

    装饰

    传送玩家

    示例


    今年年初,Unity Brighton的内容团队推出了他们的最新作品-2D游戏开发套件,该套件适用于任何希望学习在Unity中创作2D游戏的人,在不编写任何代码的情况下使用2D游戏开发套件,通过设置与拖放便能快捷的实现你的游戏创意。

    本文将通过2D游戏开发套件中的游戏示例项目,来带领大家走进2D游戏开发的世界。游戏内容是,我们的首席工程Ellen的飞船坠落在一个古老神秘的外星星球,他必须避免危险,并且击败潜伏在这个异域文明古遗址中敌人。

    项目介绍

    我们将分享使用2D游戏开发套件创建场景、绘制及测试关卡、添加移动平台、触发开门动作、游戏中的敌人、摧毁对象、传送玩家。

    你可以访问Asset Store资源商店下载2D游戏开发套件:

    https://assetstore.unity.com/packages/essentials/tutorial-projects/2d-game-kit-107098

    创建新场景

    本项目包含一个实用程序来自动创建一个新的默认场景。这个场景将包含我们英雄Ellen、一个小平台、生命值UI以及完整的移动、攻击所需要的元素。

    首先让我们来创建一个新的场景。从顶部菜单选择“Kit Tools(套件工具)“,选择 “Create New Scene(创建新场景)”。

    将会出现一个新的窗口,在“New Scene Name(新场景名称)”中,输入你希望的新场景的名称,点击“Create(创建)”。

    这样会在Project窗口的根目录创建一个新场景,然后自动添加到Build Settings中。

    我们刚刚创建好的场景在会在编辑器中自动打开,现在我们可以开始正式使用它进行开发了。

    绘制关卡

    2D游戏开发套件使用了Unity中的Tilemap功能,旨在帮助开发者轻松快速的绘制关卡,该开发套件已经设置好了一切,可以直接使用。

    让我们来设计一个关卡。在顶部菜单中,点击Window > Tile Palette(窗口>瓦片调色板)。

    Tile Palette(瓦片调色板)窗口如下图所示。

    我们已经创建好二个瓦片集(Tileset)用于绘制关卡。这些瓦片使用了Unity的Tilemap功能中的可编程脚本瓦片(Scriptable Tile)系统。它们会自动为平台选取正确的精灵。我们在这里有二种风格的精灵:一种是铺了草皮的石头,另一种是异形建筑结构。

    我们需要确保在Tile Palette瓦片调色板中选取了正确的瓦片集。

    • 点击Tileset Menu(瓦片集菜单)

    • 点击Tileset_Gamekit(瓦片集开发套件)

    • 为关卡选取想要的瓦片类型

    现在我们可以在场景中绘制瓦片来创建关卡。

    • 点击选取Tile Palette (瓦片调色板)上的瓦片

    • 把鼠标移到场景视图中

    • 点击并拖拽左键来绘制关卡

    • 在Tile Palette上点击想要的瓦片来选中它

    如果你不小心画错了,可以按住Shift并单击或拖拽左键来清除错误的瓦片。

    测试关卡

    现在我们已经创建好了关卡,现在运行测试了。按下编辑器顶部Play运行按钮。

    我们的玩家角色Ellen控制如下。

    移动:A, D

    跳跃:Space

    蹲伏:S

    射击:O

    格斗:K

    激活:E

    穿越平台:S 和 Space

    我们加入了调试菜单。按下键盘F12弹出选项,可以启用或禁用游戏视图中Ellen的各种武器。

    添加移动平台

    在场景视图中操作游戏对象前,请确保未处于绘图模式。所以我们要关闭Tile Palette瓦片调色板,或者选择编辑器左上角的移动工具,你也可以按下W,选取移动工具。

    现在让我们将移动平台加入关卡中。

    进入项目窗口,打开Prefabs > Interactables,右键单击并将MovingPlatform拖放到场景视图中,确保在层级窗口中选择了MovingPlatform,按下W使用移动工具,在MovingPlatform上使用移动工具将它放到想要的位置。

    当你选择MovingPlatform时,会出现一条红色虚线,在虚线尾部还有一个红色箭头。这个箭头表示游戏运行时该平台的移动路径。

    使用红色虚线尾部的红色箭头来设置平台的移动路径。

    如果想要预览MovingPlatform的移动路径,可以选择MovingPlatform。你可以查看检视窗口,在Moving Platform(移动平台)组件中,找到Preview Position(预览位置)滑块,点击并拖拽来移动滑块,查看MovingPlatform会怎么移动。

    现在我们要让平台以矩形为移动路径循环移动,使它的路径略为复杂。我们通过添加节点(Node)可以实现这个功能。

    对Moving Platform组件来说,节点是额外的导航点。

    在检视窗口中找到Moving Platform组件,点击二次Add Node(增加节点)。

    这样会添加二条额外的红色虚线和图示。使用图示来将你的额外节点组成矩形。

    你会注意到,目前没有路径将最后的节点和开始的节点连接在一起。如果我们按下Play运行,它会停在最后一个点上,在路径上往回移动,然后周而复始。

    你可以修改平台设置,使之形成循环。在Moving Platform组件上,找到Looping(循环)选项,点开写有BACK_FORTH的下拉列表,选择Loop循环。

    这样会在图示中形成循环,而平台则会使用这个路径。

    注意:预览滑块无法预览完整的循环,所以你需要点击Play运行来查看其实际效果。

    使用事件触发开门动作

    在2D游戏开发套件中,事件(Event)能够创建动作。我们会使用事件功能来完成玩家踩到压力板时触发开门的动作。

    首先添加一个门。在项目窗口中,打开Prefabs > Interactables。找到Door预制件,将其拖入场景视图中。将它放在阻挡玩家移动的位置。

    现在我们在场景中添加压力板。在项目窗口中,打开Prefabs > Interactables,找到PressurePad预制件,将其拖到门前的地上。

    注意:如果玩家被压力板阻挡而不能踩上去,请把压力板的位置降低一些。玩家很容易被碰撞体卡住。

    这里面一些事件已经预先定义好了。例如:当踏上压力板时,PressurePad游戏对象会播放音效并发出亮光。

    现在我们把PressurePad和Door连接起来。

    • 在层级窗口中,选中PressurePad

    • 在检视窗口中,找到Pressure Pad(压力板)组件

    • 在On Pressed列表中,点击右下方的+号,添加新事件

    • 将Door游戏对象从层级窗口拖到事件属性中的None(Object)字段

    • 在No Function下拉列表中,找到Animator > Play(string)

    在下拉列表下的文本区,输入文本DoorOpening。

    点击Play运行,使用移动按键(A或D)让角色在压力板上移动。门应该会被触发的事件打开!

    所有动画片段(Animation Clips)都存在项目窗口的Art > Animations > Animation Clips文件夹中。如果想要在同一事件中播放不同的动画,你必须正确匹配动画片段的名字(即字符串)。

    如果你想通过射击开关来开门,而不是放置压力板,你可以通过相同步骤实现,但要选择Prefabs文件夹中的ResusableSwitch预制件

    敌人

    2D游戏开发套件中有二个预制的敌人:Chomper和Spitter。 你可以在项目窗口的Prefabs> Enemies中找到它们。

    它们都由检视窗口中的Enemy Behaviour(敌人行为)组件控制。你可以使用这个组件调整一些属性,例如:敌人的速度、视野(FOV)、血量等。每个敌人都带有相同的组件,但它们的设置稍有不同。注意,除了输入特定数值之外,你也可以向左或向右点击拖动组件属性来调整数值。

    请尝试添加一个Chomper到场景中。修改设置属性来调整它的速度和视野(FOV)。不要忘记,当处于Play运行模式时,你可以按下F12来启用武器,然后通过O或K进行攻击。

    在上面的场景中,我们选中了一个Chomper。调整了它的View FOV(视野区域)和View Direction(视野方向),这样它就不会看到Ellen,除非它转身。

    摧毁敌人

    我们现在学习伤害系统。我们将通过把一个箱子扔到Spitter身上来干掉它。

    首先我们绘制一个关卡,Ellen会站在高处,而Spitter站在平台下方,如下图所示。

    打开Prefabs > Enemies,然后将Spitter拖入场景视图中,将它放在关卡中较低位置,靠近悬崖边缘。选中Spitter,找到Enemy Behaviour Script(敌人行为脚本),降低View Distance(视野距离)的数值,使Spitter不会在测试游戏的时候马上向玩家射击。

    在项目窗口中,打开Prefabs > Interactables,点击拖动PushableBox预制件到场景视图中。在层级窗口选中PushableBox,然后在检视窗口点击Add Component(添加组件)。在搜索栏输入Damage,点击搜索结果中的Damager,添加到PushableBox上。

    如上图所示,Damager由绿色碰撞方框表示。这个区域会造成伤害。它目前还未覆盖PushableBox,所以当我们把方块推到Spitter身上时,箱子不会伤害它。

    现在让我们移动这个盒子,让它有和PushableBox大概相同的位置和大小。有二种方法实现:

    • 选中并拖拽绿色碰撞箱边缘上的绿色点,使其覆盖PushableBox。

    • 在检视窗口中找到Damager组件。调整偏移(Offset)和大小(Size),定位并确定碰撞箱的大小。这样做最简单的方法是左键单击属性上的文字,然后向左向右拖动来调整数值

    最后我们需要确定该伤害值传给了正确的游戏对象。我们在编辑器中将对象分离为图层(Layer),这样它们就能轻易被找到并分离。

    选中PushableBox,在检视窗口中找到Damager组, 在HittableLayers下拉列表中,选中Enemy图层。

    PushableBox现在会对Enemy图层的任何对象产生伤害,例如我们之前的Spitter。请对其它角色试验伤害功能,甚至对主角Ellen也可以进行尝试。

    装饰

    2D游戏开发套件中还包括用来装饰的精灵,它们在示例游戏“探索者”(The Explorer)中使用。

      为了让你的关卡有分享的价值,你可以在项目视图中Art > Sprites > Environment下的找到装饰品。多数装饰品存在子文件夹中,所以不要忘记点开小箭头展开文件夹,查看目录下的其它精灵。

    提示:如果在示例游戏中有什么东西吸引了你的注意,你可以在项目视图搜索名字来找到它。 

    传送玩家

    你可以将玩家从场景中的一个区域传送到另一个区域,或是在二个不同的关卡间进行传送。

    在场景中传送

    如果想在一个场景中传送玩家,我们需要设置一个转移点(transition)。要实现这个功能,我们将需要二个预制件:TransitionStart和TransitionEnd。

    首先需要设置转移过程的起始点。在项目窗口中,打开Prefabs > SceneControl找到TransitionStart预制件,将TransitionStart拖到场景视图中。将它放到一个玩家在行走过程中能碰到其碰撞体(绿色方框)的位置。本示例中,我们放在了门口的另一边。

    然后设置目的地。从SceneControl文件夹拖拽另一个TransitionStart预制件到场景视图中,在检视窗口中,将其重命名为TransitionEnd。

    现在将二者链接起来。在层级窗口中,选中TransitionStart游戏对象;在检视窗口中找到TransitionPoint组件;将Ellen游戏对象从层级窗口拖到Transition Point(转移点)组件的Transitioning Game Object(被转移游戏对象)属性中,将Transition Type(转移类型)设为Same Scene(同一场景)。

    这会确保Ellen是唯一被传送的对象,并且她在同一场景中被传送。

    现在设置目的地:将TransitionEnd游戏对象拖入TransitionPoint组件的DestinationTransform属性中,将Transition When(何时转移)设为On Trigger Enter(进入时触发)。

    On Trigger Enter是指该转移会在玩家进入碰撞体的时候触发,不需要按下按键。如果你想要在玩家按下交互键(E)的时候才进行传送,把Transition When设为Interact Pressed(按下交互键时)即可。

    传送到另一个场景

    如果想要让玩家传送到一个新场景中,我们需要二个预制件:

    • TransitionStart预制件;它会将玩家“发送”到目的地。它包含一个Transition Start(转移起始点)组件,能够定义传送开始时的所有属性,还能确定玩家会被传送到哪里。把这个预制件放到传送开始的位置。

    • TransitionDestination是个“接收”玩家的预制件。它包含一个Transition Destination(转移目的地)组件。请把这个预制件放在另一场景中,那里会是传送结束的位置。

    设置 TransitionDestination

    首先我们设置目的地,这样就可以在设置起始点时获得所需的全部信息。若要把转移点加入场景,打开场景,在项目窗口找到Prefabs > SceneControl > TransitionDestination。把它放到传送到达的场景中。

    TransitionDestinaton预制件包含一个Scene Transition Destination(场景转移目的地)组件。

    首先设置Destination Tag(目的地标签)为一个字母。字母是什么不重要,只要这个组件是场景中唯一带有那个字母的Scene Transition Destination 组件即可。

    然后告诉它应该接收哪个游戏对象。将玩家对象(即Ellen)从层级窗口拖到Transitioning Game Object(被转移游戏对象)属性中。

    最后,确保目的地场景在编辑器的Build Setting(构建设置)中。打开File > Build Settings(文件 > 构建设置),点击Add Open Scenes(打开场景)。

    设置TransitionStart

    这些设置大部分与上一节中的设置相同,只是进行了一些更改。

    • 将Transition Type(转移类型)设为Different Level(不同关卡)

    • 将New Scene Name(新场景名字)设为目的地场景的名字

    • 将Transition Destination的标签设为你在Transition Destination Component中设置的Destination Tag对应字母

    示例

    我们要让玩家传送到游戏的第一关。在Transition Start组件中,如下修改设置:

    • 将Transition Type设为Different Level

    • 将New Scene Name设为Zone1

    • 将Transition Destination设为A

    点击运行Play,,然后移动角色到传送点。你便会传送到Zone1。

    2D游戏开发套件中的大多数对象都使用Pressure Pad设置中显示的Events系统,探索现有场景(Zones 1 to 5),了解如何使用事件和触发器设置其它对象。

    2D游戏开发套件指南就为大家介绍到这里了,希望大家能够使用它实现自己的创意,创作出精彩的2D游戏。

    Unity-3D游戏开发套件指南(入门篇)-免费资源

    可在公众号【空名先生】(ID:fansGoogle)反馈信息,关注公号获取所有免费资源(教程,运营,软件,赚钱等)。

    展开全文
  • 消息中间件MQ与RabbitMQ面试题(2020最新版)

    万次阅读 多人点赞 2020-03-01 11:11:21
    如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。 MQ 有哪些常见问题?如何解决这些问题? MQ 的常见问题有...

    Java面试总结(2021优化版)已发布在个人微信公众号【技术人成长之路】,优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结,删除了低频问题,添加了一些常见面试题,对文章进行了精简优化,欢迎大家关注!😊😊

    【技术人成长之路】,助力技术人成长!更多精彩文章第一时间在公众号发布哦!

    Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…

    序号内容链接地址
    1Java基础知识面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390612
    2Java集合容器面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588551
    3Java异常面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390689
    4并发编程面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104863992
    5JVM面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390752
    6Spring面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397516
    7Spring MVC面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397427
    8Spring Boot面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397299
    9Spring Cloud面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397367
    10MyBatis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/101292950
    11Redis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/103522351
    12MySQL数据库面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104778621
    13消息中间件MQ与RabbitMQ面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588612
    14Dubbo面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390006
    15Linux面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588679
    16Tomcat面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397665
    17ZooKeeper面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397719
    18Netty面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104391081
    19架构设计&分布式&数据结构与算法面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/105870730

    为什么使用MQ?MQ的优点

    简答

    • 异步处理 - 相比于传统的串行、并行方式,提高了系统吞吐量。
    • 应用解耦 - 系统间通过消息通信,不用关心其他系统的处理。
    • 流量削锋 - 可以通过消息队列长度控制请求量;可以缓解短时间内的高并发请求。
    • 日志处理 - 解决大量日志传输。
    • 消息通讯 - 消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。

    详答

    主要是:解耦、异步、削峰。

    解耦:A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃…A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。如果使用 MQ,A 系统产生一条数据,发送到 MQ 里面去,哪个系统需要数据自己去 MQ 里面消费。如果新系统需要数据,直接从 MQ 里消费即可;如果某个系统不需要这条数据了,就取消对 MQ 消息的消费即可。这样下来,A 系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑人家是否调用成功、失败超时等情况。

    就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用 MQ 给它异步化解耦。

    异步:A 系统接收一个请求,需要在自己本地写库,还需要在 BCD 三个系统写库,自己本地写库要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 + 450 + 200 = 953ms,接近 1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请求。如果使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一个请求到返回响应给用户,总时长是 3 + 5 = 8ms。

    削峰:减少高峰时期对服务器压力。

    消息队列有什么优缺点?RabbitMQ有什么优缺点?

    优点上面已经说了,就是在特殊场景下有其对应的好处解耦异步削峰

    缺点有以下几个:

    系统可用性降低

    本来系统运行好好的,现在你非要加入个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性会降低;

    系统复杂度提高

    加入了消息队列,要多考虑很多方面的问题,比如:一致性问题、如何保证消息不被重复消费、如何保证消息可靠性传输等。因此,需要考虑的东西更多,复杂性增大。

    一致性问题

    A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。

    所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,做好之后,你会发现,妈呀,系统复杂度提升了一个数量级,也许是复杂了 10 倍。但是关键时刻,用,还是得用的。

    你们公司生产环境用的是什么消息中间件?

    这个首先你可以说下你们公司选用的是什么消息中间件,比如用的是RabbitMQ,然后可以初步给一些你对不同MQ中间件技术的选型分析。

    举个例子:比如说ActiveMQ是老牌的消息中间件,国内很多公司过去运用的还是非常广泛的,功能很强大。

    但是问题在于没法确认ActiveMQ可以支撑互联网公司的高并发、高负载以及高吞吐的复杂场景,在国内互联网公司落地较少。而且使用较多的是一些传统企业,用ActiveMQ做异步调用和系统解耦。

    然后你可以说说RabbitMQ,他的好处在于可以支撑高并发、高吞吐、性能很高,同时有非常完善便捷的后台管理界面可以使用。

    另外,他还支持集群化、高可用部署架构、消息高可靠支持,功能较为完善。

    而且经过调研,国内各大互联网公司落地大规模RabbitMQ集群支撑自身业务的case较多,国内各种中小型互联网公司使用RabbitMQ的实践也比较多。

    除此之外,RabbitMQ的开源社区很活跃,较高频率的迭代版本,来修复发现的bug以及进行各种优化,因此综合考虑过后,公司采取了RabbitMQ。

    但是RabbitMQ也有一点缺陷,就是他自身是基于erlang语言开发的,所以导致较为难以分析里面的源码,也较难进行深层次的源码定制和改造,毕竟需要较为扎实的erlang语言功底才可以。

    然后可以聊聊RocketMQ,是阿里开源的,经过阿里的生产环境的超高并发、高吞吐的考验,性能卓越,同时还支持分布式事务等特殊场景。

    而且RocketMQ是基于Java语言开发的,适合深入阅读源码,有需要可以站在源码层面解决线上生产问题,包括源码的二次开发和改造。

    另外就是Kafka。Kafka提供的消息中间件的功能明显较少一些,相对上述几款MQ中间件要少很多。

    但是Kafka的优势在于专为超高吞吐量的实时日志采集、实时数据同步、实时数据计算等场景来设计。

    因此Kafka在大数据领域中配合实时计算技术(比如Spark Streaming、Storm、Flink)使用的较多。但是在传统的MQ中间件使用场景中较少采用。

    Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

    ActiveMQRabbitMQRocketMQKafkaZeroMQ
    单机吞吐量比RabbitMQ低2.6w/s(消息做持久化)11.6w/s17.3w/s29w/s
    开发语言JavaErlangJavaScala/JavaC
    主要维护者ApacheMozilla/SpringAlibabaApacheiMatix,创始人已去世
    成熟度成熟成熟开源版本不够成熟比较成熟只有C、PHP等版本成熟
    订阅形式点对点(p2p)、广播(发布-订阅)提供了4种:direct, topic ,Headers和fanout。fanout就是广播模式基于topic/messageTag以及按照消息类型、属性进行正则匹配的发布订阅模式基于topic以及按照topic进行正则匹配的发布订阅模式点对点(p2p)
    持久化支持少量堆积支持少量堆积支持大量堆积支持大量堆积不支持
    顺序消息不支持不支持支持支持不支持
    性能稳定性一般较差很好
    集群方式支持简单集群模式,比如’主-备’,对高级集群模式支持不好。支持简单集群,'复制’模式,对高级集群模式支持不好。常用 多对’Master-Slave’ 模式,开源版本需手动切换Slave变成Master天然的‘Leader-Slave’无状态集群,每台服务器既是Master也是Slave不支持
    管理界面一般较好一般

    综上,各种对比之后,有如下建议:

    一般的业务系统要引入 MQ,最早大家都用 ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,所以大家还是算了吧,我个人不推荐用这个了;

    后来大家开始用 RabbitMQ,但是确实 erlang 语言阻止了大量的 Java 工程师去深入研究和掌控它,对公司而言,几乎处于不可控的状态,但是确实人家是开源的,比较稳定的支持,活跃度也高;

    不过现在确实越来越多的公司会去用 RocketMQ,确实很不错,毕竟是阿里出品,但社区可能有突然黄掉的风险(目前 RocketMQ 已捐给 Apache,但 GitHub 上的活跃度其实不算高)对自己公司技术实力有绝对自信的,推荐用 RocketMQ,否则回去老老实实用 RabbitMQ 吧,人家有活跃的开源社区,绝对不会黄。

    所以中小型公司,技术实力较为一般,技术挑战不是特别高,用 RabbitMQ 是不错的选择;大型公司,基础架构研发实力较强,用 RocketMQ 是很好的选择。

    如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。

    MQ 有哪些常见问题?如何解决这些问题?

    MQ 的常见问题有:

    1. 消息的顺序问题
    2. 消息的重复问题

    消息的顺序问题

    消息有序指的是可以按照消息的发送顺序来消费。

    假如生产者产生了 2 条消息:M1、M2,假定 M1 发送到 S1,M2 发送到 S2,如果要保证 M1 先于 M2 被消费,怎么做?

    img

    解决方案:

    (1)保证生产者 - MQServer - 消费者是一对一对一的关系

    img

    缺陷:

    • 并行度就会成为消息系统的瓶颈(吞吐量不够)
    • 更多的异常处理,比如:只要消费端出现问题,就会导致整个处理流程阻塞,我们不得不花费更多的精力来解决阻塞的问题。 (2)通过合理的设计或者将问题分解来规避。
    • 不关注乱序的应用实际大量存在
    • 队列无序并不意味着消息无序 所以从业务层面来保证消息的顺序而不仅仅是依赖于消息系统,是一种更合理的方式。

    消息的重复问题

    造成消息重复的根本原因是:网络不可达。

    所以解决这个问题的办法就是绕过这个问题。那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理?

    消费端处理消息的业务逻辑保持幂等性。只要保持幂等性,不管来多少条重复消息,最后处理的结果都一样。保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现。利用一张日志表来记录已经处理成功的消息的 ID,如果新到的消息 ID 已经在日志表中,那么就不再处理这条消息。

    什么是RabbitMQ?

    RabbitMQ是一款开源的,Erlang编写的,基于AMQP协议的消息中间件

    rabbitmq 的使用场景

    (1)服务间异步通信

    (2)顺序消费

    (3)定时任务

    (4)请求削峰

    RabbitMQ基本概念

    • Broker: 简单来说就是消息队列服务器实体
    • Exchange: 消息交换机,它指定消息按什么规则,路由到哪个队列
    • Queue: 消息队列载体,每个消息都会被投入到一个或多个队列
    • Binding: 绑定,它的作用就是把exchange和queue按照路由规则绑定起来
    • Routing Key: 路由关键字,exchange根据这个关键字进行消息投递
    • VHost: vhost 可以理解为虚拟 broker ,即 mini-RabbitMQ server。其内部均含有独立的 queue、exchange 和 binding 等,但最最重要的是,其拥有独立的权限系统,可以做到 vhost 范围的用户控制。当然,从 RabbitMQ 的全局角度,vhost 可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的 vhost 中)。
    • Producer: 消息生产者,就是投递消息的程序
    • Consumer: 消息消费者,就是接受消息的程序
    • Channel: 消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务

    由Exchange、Queue、RoutingKey三个才能决定一个从Exchange到Queue的唯一的线路。

    RabbitMQ的工作模式

    一.simple模式(即最简单的收发模式)

    img

    1.消息产生消息,将消息放入队列

    2.消息的消费者(consumer) 监听 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失,这里可以设置成手动的ack,但如果设置成手动ack,处理完后要及时发送ack消息给队列,否则会造成内存溢出)。

    二.work工作模式(资源的竞争)

    img

    1.消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2同时监听同一个队列,消息被消费。C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患:高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize) 保证一条消息只能被一个消费者使用)。

    三.publish/subscribe发布订阅(共享资源)

    img

    1、每个消费者监听自己的队列;

    2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。

    四.routing路由模式

    img

    1.消息生产者将消息发送给交换机按照路由判断,路由是字符串(info) 当前产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息;

    2.根据业务功能定义路由字符串

    3.从系统的代码逻辑中获取对应的功能字符串,将消息任务扔到对应的队列中。

    4.业务场景:error 通知;EXCEPTION;错误通知的功能;传统意义的错误通知;客户通知;利用key路由,可以将程序中的错误封装成消息传入到消息队列中,开发者可以自定义消费者,实时接收错误;

    五.topic 主题模式(路由模式的一种)

    img

    1.星号井号代表通配符

    2.星号代表多个单词,井号代表一个单词

    3.路由功能添加模糊匹配

    4.消息产生者产生消息,把消息交给交换机

    5.交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费

    (在我的理解看来就是routing查询的一种模糊匹配,就类似sql的模糊查询方式)

    如何保证RabbitMQ消息的顺序性?

    拆分多个 queue,每个 queue 一个 consumer,就是多一些 queue 而已,确实是麻烦点;或者就一个 queue 但是对应一个 consumer,然后这个 consumer 内部用内存队列做排队,然后分发给底层不同的 worker 来处理。

    消息如何分发?

    若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。通过路由可实现多消费的功能

    消息怎么路由?

    消息提供方->路由->一至多个队列消息发布到交换器时,消息将拥有一个路由键(routing key),在消息创建时设定。通过队列路由键,可以把队列绑定到交换器上。消息到达交换器后,RabbitMQ 会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则);

    常用的交换器主要分为一下三种:

    fanout:如果交换器收到消息,将会广播到所有绑定的队列上

    direct:如果路由键完全匹配,消息就被投递到相应的队列

    topic:可以使来自不同源头的消息能够到达同一个队列。 使用 topic 交换器时,可以使用通配符

    消息基于什么传输?

    由于 TCP 连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ 使用信道的方式来传输数据。信道是建立在真实的 TCP 连接内的虚拟连接,且每条 TCP 连接上的信道数量没有限制。

    如何保证消息不被重复消费?或者说,如何保证消息消费时的幂等性?

    先说为什么会重复消费:正常情况下,消费者在消费消息的时候,消费完毕后,会发送一个确认消息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除;

    但是因为网络传输等等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将消息分发给其他的消费者。

    针对以上问题,一个解决思路是:保证消息的唯一性,就算是多次传输,不要让消息的多次消费带来影响;保证消息等幂性;

    比如:在写入消息队列的数据做唯一标示,消费消息时,根据唯一标识判断是否消费过;

    假设你有个系统,消费一条消息就往数据库里插入一条数据,要是你一个消息重复两次,你不就插入了两条,这数据不就错了?但是你要是消费到第二次的时候,自己判断一下是否已经消费过了,若是就直接扔了,这样不就保留了一条数据,从而保证了数据的正确性。

    如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?

    发送方确认模式

    将信道设置成 confirm 模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的 ID。

    一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一 ID)。

    如果 RabbitMQ 发生内部错误从而导致消息丢失,会发送一条 nack(notacknowledged,未确认)消息。

    发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。

    接收方确认机制

    消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作)。只有消费者确认了消息,RabbitMQ 才能安全地把消息从队列中删除。

    这里并没有用到超时机制,RabbitMQ 仅通过 Consumer 的连接中断来确认是否需要重新发送消息。也就是说,只要连接不中断,RabbitMQ 给了 Consumer 足够长的时间来处理消息。保证数据的最终一致性;

    下面罗列几种特殊情况

    • 如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ 会认为消息没有被分发,然后重新分发给下一个订阅的消费者。(可能存在消息重复消费的隐患,需要去重)
    • 如果消费者接收到消息却没有确认消息,连接也未断开,则 RabbitMQ 认为该消费者繁忙,将不会给该消费者分发更多的消息。

    如何保证RabbitMQ消息的可靠传输?

    消息不可靠的情况可能是消息丢失,劫持等原因;

    丢失又分为:生产者丢失消息、消息列表丢失消息、消费者丢失消息;

    生产者丢失消息:从生产者弄丢数据这个角度来看,RabbitMQ提供transaction和confirm模式来确保生产者不丢消息;

    transaction机制就是说:发送消息前,开启事务(channel.txSelect()),然后发送消息,如果发送过程中出现什么异常,事务就会回滚(channel.txRollback()),如果发送成功则提交事务(channel.txCommit())。然而,这种方式有个缺点:吞吐量下降;

    confirm模式用的居多:一旦channel进入confirm模式,所有在该信道上发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后;

    rabbitMQ就会发送一个ACK给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了;

    如果rabbitMQ没能处理该消息,则会发送一个Nack消息给你,你可以进行重试操作。

    消息队列丢数据:消息持久化。

    处理消息队列丢数据的情况,一般是开启持久化磁盘的配置。

    这个持久化配置可以和confirm机制配合使用,你可以在消息持久化磁盘后,再给生产者发送一个Ack信号。

    这样,如果消息持久化磁盘之前,rabbitMQ阵亡了,那么生产者收不到Ack信号,生产者会自动重发。

    那么如何持久化呢?

    这里顺便说一下吧,其实也很容易,就下面两步

    1. 将queue的持久化标识durable设置为true,则代表是一个持久的队列
    2. 发送消息的时候将deliveryMode=2

    这样设置以后,即使rabbitMQ挂了,重启后也能恢复数据

    消费者丢失消息:消费者丢数据一般是因为采用了自动确认消息模式,改为手动确认消息即可!

    消费者在收到消息之后,处理消息之前,会自动回复RabbitMQ已收到消息;

    如果这时处理消息失败,就会丢失该消息;

    解决方案:处理消息成功后,手动回复确认消息。

    为什么不应该对所有的 message 都使用持久化机制?

    首先,必然导致性能的下降,因为写磁盘比写 RAM 慢的多,message 的吞吐量可能有 10 倍的差距。

    其次,message 的持久化机制用在 RabbitMQ 的内置 cluster 方案时会出现“坑爹”问题。矛盾点在于,若 message 设置了 persistent 属性,但 queue 未设置 durable 属性,那么当该 queue 的 owner node 出现异常后,在未重建该 queue 前,发往该 queue 的 message 将被 blackholed ;若 message 设置了 persistent 属性,同时 queue 也设置了 durable 属性,那么当 queue 的 owner node 异常且无法重启的情况下,则该 queue 无法在其他 node 上重建,只能等待其 owner node 重启后,才能恢复该 queue 的使用,而在这段时间内发送给该 queue 的 message 将被 blackholed 。

    所以,是否要对 message 进行持久化,需要综合考虑性能需要,以及可能遇到的问题。若想达到 100,000 条/秒以上的消息吞吐量(单 RabbitMQ 服务器),则要么使用其他的方式来确保 message 的可靠 delivery ,要么使用非常快速的存储系统以支持全持久化(例如使用 SSD)。另外一种处理原则是:仅对关键消息作持久化处理(根据业务重要程度),且应该保证关键消息的量不会导致性能瓶颈。

    如何保证高可用的?RabbitMQ 的集群

    RabbitMQ 是比较有代表性的,因为是基于主从(非分布式)做高可用性的,我们就以 RabbitMQ 为例子讲解第一种 MQ 的高可用性怎么实现。RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式。

    单机模式,就是 Demo 级别的,一般就是你本地启动了玩玩儿的?,没人生产用单机模式

    普通集群模式,意思就是在多台机器上启动多个 RabbitMQ 实例,每个机器启动一个。你创建的 queue,只会放在一个 RabbitMQ 实例上,但是每个实例都同步 queue 的元数据(元数据可以认为是 queue 的一些配置信息,通过元数据,可以找到 queue 所在实例)。你消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从 queue 所在实例上拉取数据过来。这方案主要是提高吞吐量的,就是说让集群中多个节点来服务某个 queue 的读写操作。

    镜像集群模式:这种模式,才是所谓的 RabbitMQ 的高可用模式。跟普通集群模式不一样的是,在镜像集群模式下,你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,就是说,每个 RabbitMQ 节点都有这个 queue 的一个完整镜像,包含 queue 的全部数据的意思。然后每次你写消息到 queue 的时候,都会自动把消息同步到多个实例的 queue 上。RabbitMQ 有很好的管理控制台,就是在后台新增一个策略,这个策略是镜像集群模式的策略,指定的时候是可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,再次创建 queue 的时候,应用这个策略,就会自动将数据同步到其他的节点上去了。这样的话,好处在于,你任何一个机器宕机了,没事儿,其它机器(节点)还包含了这个 queue 的完整数据,别的 consumer 都可以到其它节点上去消费数据。坏处在于,第一,这个性能开销也太大了吧,消息需要同步到所有机器上,导致网络带宽压力和消耗很重!RabbitMQ 一个 queue 的数据都是放在一个节点里的,镜像集群下,也是每个节点都放这个 queue 的完整数据。

    如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?

    消息积压处理办法:临时紧急扩容:

    先修复 consumer 的问题,确保其恢复消费速度,然后将现有 cnosumer 都停掉。
    新建一个 topic,partition 是原来的 10 倍,临时建立好原先 10 倍的 queue 数量。
    然后写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue。
    接着临时征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据。这种做法相当于是临时将 queue 资源和 consumer 资源扩大 10 倍,以正常的 10 倍速度来消费数据。
    等快速消费完积压数据之后,得恢复原先部署的架构,重新用原先的 consumer 机器来消费消息。
    MQ中消息失效:假设你用的是 RabbitMQ,RabbtiMQ 是可以设置过期时间的,也就是 TTL。如果消息在 queue 中积压超过一定的时间就会被 RabbitMQ 给清理掉,这个数据就没了。那这就是第二个坑了。这就不是说数据会大量积压在 mq 里,而是大量的数据会直接搞丢。我们可以采取一个方案,就是批量重导,这个我们之前线上也有类似的场景干过。就是大量积压的时候,我们当时就直接丢弃数据了,然后等过了高峰期以后,比如大家一起喝咖啡熬夜到晚上12点以后,用户都睡觉了。这个时候我们就开始写程序,将丢失的那批数据,写个临时程序,一点一点的查出来,然后重新灌入 mq 里面去,把白天丢的数据给他补回来。也只能是这样了。假设 1 万个订单积压在 mq 里面,没有处理,其中 1000 个订单都丢了,你只能手动写程序把那 1000 个订单给查出来,手动发到 mq 里去再补一次。

    mq消息队列块满了:如果消息积压在 mq 里,你很长时间都没有处理掉,此时导致 mq 都快写满了,咋办?这个还有别的办法吗?没有,谁让你第一个方案执行的太慢了,你临时写程序,接入数据来消费,消费一个丢弃一个,都不要了,快速消费掉所有的消息。然后走第二个方案,到了晚上再补数据吧。

    设计MQ思路

    比如说这个消息队列系统,我们从以下几个角度来考虑一下:

    首先这个 mq 得支持可伸缩性吧,就是需要的时候快速扩容,就可以增加吞吐量和容量,那怎么搞?设计个分布式的系统呗,参照一下 kafka 的设计理念,broker -> topic -> partition,每个 partition 放一个机器,就存一部分数据。如果现在资源不够了,简单啊,给 topic 增加 partition,然后做数据迁移,增加机器,不就可以存放更多数据,提供更高的吞吐量了?

    其次你得考虑一下这个 mq 的数据要不要落地磁盘吧?那肯定要了,落磁盘才能保证别进程挂了数据就丢了。那落磁盘的时候怎么落啊?顺序写,这样就没有磁盘随机读写的寻址开销,磁盘顺序读写的性能是很高的,这就是 kafka 的思路。

    其次你考虑一下你的 mq 的可用性啊?这个事儿,具体参考之前可用性那个环节讲解的 kafka 的高可用保障机制。多副本 -> leader & follower -> broker 挂了重新选举 leader 即可对外服务。

    能不能支持数据 0 丢失啊?可以的,参考我们之前说的那个 kafka 数据零丢失方案。

    展开全文
  • 研究生工程伦理课程答案整理

    万次阅读 2019-12-17 09:55:12
    研究生工程伦理课程,因为考试需要,自己整理的题库与答案,供自己以后复习时使用… 1.工程与伦理–第一章习题 1.多选(1/1分) 对“什么是好的、正当的行为方式?...2.多选(1/1分) 工程活动集成了多种要素,包...

    研究生工程伦理课程,因为考试需要,自己整理的题库与答案,供自己以后复习时使用…

    1.工程与伦理–第一章习题
    1.多选(1/1分) 对“什么是好的、正当的行为方式?”这一问题的思考和争议由来已久,从而形成了不同的伦理学思想和伦理立场。大体上,可以把这些伦理立场概括为()

    口功利论
    口契约论
    口义务论
    口德性论
    正确答案:功利论 契约论 义务论 德性论

    2.多选(1/1分) 工程活动集成了多种要素,包括技术要素、经济要素、社会要素、自然要素和伦理要素等。将伦理维度运用到其他要素,就形成了工程伦理关注的四个方面的问题,即()

    口工程伦理的责任伦理问题
    口工程伦理的环境伦理问题
    口工程伦理的技术伦理问题
    口工程伦理的利益伦理问题
    正确答案:工程伦理的责任伦理问题 工程伦理的环境伦理问题 工程伦理的技术伦理问题 工程伦理的利益伦理问题

    V3.多选(1/1分) 根据伦理规范得到社会认可和被制度化的程度,可以将伦理规范分为()两种情况。
    口制度性的伦理规范
    强制性的伦理规范
    口描述性的伦理规范
    口普 遍性的伦理规范
    正确答案:制度性的伦理规范 描述性的伦理规范

    2.工程中的风险、安全与责任–第…
    1.单选(1/1分) 当工程风险产生的不利后果比较严重,又无其他策略可用时,通过变更工程项目计划,从而消除风险本身或消除风险产生的条件,达到规避风险的目的。这种做法属于意外风险应对的哪种措施?
    风险转移
    风险遏制
    风险回避
    风险化解
    正确答案:风险回避

    2.单选(1/1分) 工程风险的伦理评估原则不包括

    以人为本原则
    预防为主原则
    制度约束原则
    ●经济至上原则
    正确答案:经济至上原则

    3.单选(1/1分) 当工程师发现所在的企业或公司进行的工程活动会对环境、社会和公众的人身安全产生危害时,应该及时地给予反映或揭发。这属于工程师的
    职业伦理责任
    ●社会伦理责任
    个人伦理责任
    法律责任
    正确答案:社会伦理责任

    3.工程中的价值、利益与公正–第…

    1.多选(1/1分) 2004年在上海召开的世界工程师大会通过的《上海宣言》,呼吁各国政府应当充分认识工程在_____________、促进各种文化的沟通合作和消除冲突中的作用。
    口社会经济发展
    回保障人们基本需求
    口消除贫困
    口缩小知识鸿沟
    正确答案:社会经济发展 保障人们基本需求 消除贫困 缩小知识鸿沟

    2.单选(1/1分) 工程的内在价值在于为我们提供实现各种目的的工具、手段等,以及提高行动的效率,-般它具有_
    道德性
    ●非道德性
    善恶性
    伦理性
    正确答案:非道德性

    3.单选(1/1分) 近些年来,企业管理领域扩展了关注的视域,由过去只强调对股东负责,逐渐扩大到把________________也纳入管理关注的视野。
    投资者
    ●利益相关者
    企业盈利
    企业未来
    正确答案:利益相关者

    4.工程活动中的环境伦理-第四章…
    1.多选(1/1分) 工业化时代在自然环境保护问题.上有两种完全不同路线,它们分别是
    口资源保护主义
    环境保护主义日
    人类中心主义
    口自然保护主义
    正确答案:资源保护主义 自然保护主义

    2.多选(1/1分) 以下哪些工程没有遵循自然规律,成为生态上失败的工程
    里海水利工程
    口咸海水利工程
    口三门峡水利枢纽
    三峡水利枢纽

    正确答案:咸海水利工程 三门峡水利枢纽

    V3.多选(1/1分) 处理工程活动中的环境伦理问题需要运用的伦理原则主要有:
    口尊重原则
    口整体性原则
    口不损害原则
    口补偿原则
    正确答案:尊重原则 整体性原则 不损害原则 补偿原则

    5.工程师的职业伦理–第五章习题
    1.单选(1/1分) “行业”、“产业”和“职业”三者的本质区别在于:
    “职业”参与了社会分工,而“行业”和“产业”没有参与社会分工
    “行业”和“产业”是从经济与社会的维度关注“物”的功能与消费,而“职业”关注劳动者为社会创造物质财富和精神财富
    ●“行业” 和“产业”的视角中缺位“人”的作用,而“职业”则是以“人”为核心来看待“物”
    “职业” 是劳动者在社会中用以谋生的工作,“行业” 是对从事国民经济生产和经营的单位或者个体的组织结构体系的详细划分,“产业” 主要指经济社会的物质生产部门,“产业” 由“行业”组成,“职业” 只是劳动者从事某一“行业”工作的符号而已
    正确答案:“行业” 和“产业”的视角中缺位“人”的作用,而“职业”则是以“人”为核心来看待“物”

    2.多选(1/1分) 对工程师的理解,以下哪一种/些说法是恰当的或准确的?
    口工程学历、工作经历与所从事的工作是成为工程师的三个必要条件
    口应当区分科学家与工程师
    口工程师是职业资格鉴定制度的结果
    工程师就是从事工程工作的人
    所在单位认为是工程师的人就是工程师
    正确答案:工程学历、工作经历与所从事的工作是成为工程师的三个必要条件 应当区分科学家与工程师 工程师是职业资格鉴定制度的结果

    3.多选(1/1分) 工程师的职业伦理规范主要包括首要责任原则和
    口工程师的权利与责任
    口工程师的职业美德
    如何增加企业利润
    口如何做正确的伦理决策
    正确答案:工程师的权利与责仟 工程师的职业美德 如何做正确的伦理决策

    6.水利工程伦理-第六章习题
    1.多选(1/1分) 目前,对水利工程进行可行性论证时,包含如下哪些评价内容:
    口技术
    口经济
    口环境
    日伦理
    正确答案:技术. 经济 环境

    2.多选(1/1分) 在进行区域水资源配置时,为贯彻公平正义的原则,应该考虑哪些因素?
    口区域对水资源总量的贡献
    口区域对水资源的依赖程度
    口区域的整体经济社会水平
    口区域的生态环境用水额度

    正确答案:区域对水资源总量的贡献 区域对水资源的依赖程度 区域的整体经济社会水平 区域的生态环境用水额度

    3.单选(1/1分) 关于水利工程移民,下面的判断不正确的是:
    移民的权利应该得到充分尊重,但应该以法律为界。
    ●国家应该无条件承担移民补偿安置的主体义务。
    对移民的损失进行合理的计算和补偿是落实公正原则的核心。
    大型水利工程移民,补偿由中央政府承担,具有一定合理性。

    正确答案: 国家应该无条件承担移民补偿安置的主体义务。

    7.生物医药工程伦理–第七章习题
    1.单选(1/1分) 如果科研人员招募受试者时确立了公开、透明和科学的准入和排除标准,就体现了下列哪种公正类型?
    ●程序公正
    回报公正
    分配公正
    正确答案:程序公正

    2.单选(1/1分) 如果科研人员篡改科研论文图像和数据,这就违反了下列哪条伦理准则?
    知情选择
    风险最低化
    受益最大化
    ●诚实守信
    协同互助
    正确答案:诚实守信

    3.单选(1/1分) 你是否赞同下列说法,当前科学家发现的“疾病相关基因”都是坏基因
    赞同
    ●反对
    正确答案:反对

    8.核_ I程的佗理向題–第八章月題
    V1.多洗(1/1分) 与其他工程相比,核工程具有一-系列特点,主要包括()
    規模大
    投姿高
    系統筒単
    技木成熟度要求高

    正答案:規模大 投资高 技木成熟度要求高

    2.多迭(1/1分) 影呵核事故信息公幵的主要因素包括()
    』政治因素:
    の経済因素
    ■社会因素
    技木因素
    正確答案:政治因素 经济因素 社会因素 技木因素

    3.单选(1/1分) 就温室气体排放而言,产生单位电量的核电所排放的CO2量比煤电()

    ●小
    相当
    不确定
    正确答案:

    9.信息技术与大数据伦理问题–第…
    1.单选(1/1分) 与机械技术、电气技术相比,信息技术具有连接能力、() 能力、()能力和融合能力。随着物联网、云计算、大数据应用风起云涌,信息化正在飞速改变人们生产、生活和思维方式,被认为具有强烈的跨界“颠覆性”。
    异构,交互
    异构,渗透
    ●交互,渗透
    重构,交互
    正确答案:交互,渗透
    2.多选(1/1分) 以下哪些方面,是大数据创新科技人员应当具备的伦理责任。请选择五项内容()。
    口尊重他人
    口以企业利益为先
    口公平待人
    口为增进社会福祉尽力
    秉持技术中立、无害信条
    口避免伤害他人利益
    口遵守法律和行业规范
    正确答案: 尊重他人 公平待人 为增进社会福祉尽力 避免伤害他人利益 遵守法律和行业规范

    V3.多选(1/1分) 由于大数据创新往往离不开“人”的特性或其社会属性,因而带来了很多新颖的伦理困境。以下哪些是信息和网络技术已经带来的伦理风险?请选择四项内容()
    口人际关系虚拟化
    数字身份困境日个人隐私边界
    口虚拟行为的正当性
    口知识产权争议
    数据资产与权利之困
    口全球化网络空间治理困境
    大数据治理与公权力边界
    正确答案:人际关系虚拟化 虚拟行为的正当性 知识产权争议 全球化网络空间治理困境

    10.环境工程的伦理问题–课后习题
    1.单选(1/1分) 以下哪项是环境工程师首要遵守的准则()。
    ●将公众的安全、健康和福祉置于首位
    仅在他们有能力胜任的领域内从事工作
    仅以客观的和诚实的方式发表公开声明
    作为忠诚的代理人和受托人为雇主和客户从事职业工作.
    正确答案:将公众的安全、健康和福祉置于首位

      V2.单选(1/1分) 刘明是负责再生水厂建设项目的设计工程师,他很喜欢这个工作,他的设计方案并未得到业内经验丰富的工程师审核,而是经过领导相熟的几位专业人员进行简单评审之后就开始了工程建设,刘明很担心由于自己经验不足导致出现严重问题,对刘明后续行动建议中相对最好的第- -选择是()。
    

    告诉上司,说自己不能继续从事超出自己能力经验的设计工作,并且可能不得不考虑换- -份工作,通知相关工程安全管理机构或其他能够制止这种行为的机构。
    ●再次找到主管,并以最合适的方式说明他对自己的设计没有得到恰当的审核而感到不安,并指出生产可能有缺陷的设计不符合公司的利益。
    直接另谋一份工作,而对过去的事保持沉默,让其他年轻的工程师继续做这份工作。
    继续目前的工作而不做任何的举动。

    正确答案:再次找到主管,并以最合适的方式说明他对自己的设计没有得到恰当的审核而感到不安,并指出生产可能有缺陷的设计不符合公司的利益。

    3.多选(1/1分) 非人类中心主义主张()。
    口人类以外的某些存在物拥有道德
    口人类是自然界的主人和统治者
    口并非人类才有价值,尊重大自然
    口人类是自然界中的一环,不是统治者
    正确答案: 人类以外的某些存在物拥有道德 并非人类才有价值,尊重大自然
    人类是自然界中的一环,不是统治者

    展开全文
  • 第一 ~ 五章 ...第六章 目前,对水利工程进行可行性论证时,包含...在进行区域水资源配置时,为贯彻公平正义的原则,应该考虑哪些因素? 区域对水资源总量的贡献 区域对水资源的依赖程度 区域的整体经济社会水平...
  • 【数据库学习】数据库总结

    万次阅读 多人点赞 2018-07-26 13:26:41
    2)特点 ①数据库数据特点 永久存储、有组织、可共享。 (数据的最小存取单位是数据项) ②数据库系统的特点 数据结构化 数据的共享性,冗余度,易扩充 数据独立性高 逻辑数据独立性...
  • DDOS入门介绍(一):DDOS简介

    万次阅读 多人点赞 2017-05-27 15:58:31
    定义分布式拒绝服务(DDoS:...通常该攻击方式利用目标系统网络服务功能缺陷或者直接消耗其系统资源,使得该目标系统无法提供正常的服务。。攻击的方式DDoS攻击通过大量的请求占用大量网络资源,以达到瘫痪网络的目的。攻
  • 《人工智能杂记》人工智能时间简史

    万次阅读 多人点赞 2018-03-13 08:54:55
    1人工智能基本概念 人工智能(Artificial Intelligence,AI)是指计算机像人一样拥有智能能力,是一个融合计算机科学、...2人工智能发展历程 人工智能的起源:人工智能在五六十年代时正式提出,1950年,一...
  • Fiddler使用教程

    万次阅读 多人点赞 2018-11-01 16:46:14
    2.详情和数据统计板,针对每条http请求的具体统计(例如发送/接受字节数,发送/接收时间,还有粗略统计世界各地访问该服务器所花费的时间)和数据包分析。如inspector面板下,提供headers、textview、hexview,Raw等...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
  • 原文地址:好物分享 | 也许是最好用的百度云资源搜索工具 百度云 一个神奇的存在 在其他云盘纷纷倒下时 它依然坚挺着 你是不是在想 如何能够搜索全网的资源? 今天就给大家分享一个神器:PanDownload 这里不是看它...
  • 15个C++项目列表

    万次阅读 多人点赞 2016-11-30 18:02:05
    如果你还是C++新手的话,那么这个C++的项目列表你可以拿练手实战开发,毕竟学编程动手实践是少不了的! 如果你不知道C++可以用来做哪些项目,可以应用在哪些地方,那么,这个项目列表拿吧,可以看看C++可以做...
  • DBA学习计划

    万次阅读 多人点赞 2018-06-17 13:11:24
     2、数据库是构建在操作系统之上的,你还需要精通系统技术。当然,完全不必要学习系统管理员那样高深的技术理论。  3、你还需要掌握服务器硬件、软件技术理论。便于数据库基于服务器问题出现的时候,能够及时提出...
  • Win10 桌面美化

    万次阅读 多人点赞 2019-02-02 15:51:44
    Win10桌面美化 最近发现了几款Win10界面美化的软件,看了看别人家的Win10操作界面,瞬间觉得自己的low了,关键是赏心悦目啊!废话不多说,先看看我原来桌面和美化后...可以发现切换效果与mac类似,默认的主题是 C...
  • 简单介绍了Minecraft (我的世界)的游戏模式,重点介绍了创造模式(建造模式)、管理命令、基本操作方法、快捷键、坐标系和设置永久白天。
  • 新视野大学英语(第三版)读写教程4答案

    万次阅读 多人点赞 2018-04-19 11:49:21
    Unit 1TextATextA .... crumbled2. discern3. surpass4. shrewd5. conversion6. distort7. radiant8. Ingenious9. propositionTextA : Language focus Word building Practice 1delicacybankruptcyac...
  • 甘特图详解

    万次阅读 2019-01-14 18:37:25
    甘特图详解一、介绍二、历史发展三、优缺点1、优点2、 缺点四、应用范围1、项目管理2、其它领域五、软件工具六、使用1、效果图示2、步骤3、资料参考 一、介绍 甘特图是一种条形图,它说明了项目进度表。该图表列出...
  • 如何在Cocos2d-JS环境下使用Cocos Studio导出的资源

    千次阅读 热门讨论 2015-03-29 14:17:32
    如果你尝试了无数次,依旧搞不懂如何在Cocos2d-JS环境下使用Cocos Studio导出的资源,如果你痛苦挣扎想要放弃,如果你看到无数教程,依旧不知所云,错误重重,请看这里,你会发现世界很美好,入门So Easy!...
  • 当然没问题,今天就把多年收藏整理的各类资源网站全都分享出来,都是完全免费的“资源”网站,质量非常高,一起来看看吧! 1. 虫部落 网址:https://search.chongbuluo.com 功能特点:聚合搜索平台,集成了100多个...
  • 人力资源管理软件(完全免费)

    千次下载 热门讨论 2011-03-08 11:36:20
    提供个税工具,应发金额、所得税、应发任输一个数据自动计算另外2个 灵活生成各类统计报表,可定制方案 查询非常方便,支持组合条件查询 支持员工数据导入,支持初始工资数据导入,启用非常方便(见dll目录下导入...
  • 如何在网上下载自己需要的资源

    千次阅读 2018-02-12 00:00:00
    本文来自作者 曹某某 在 GitChat 上分享 「如何在网上下载自己需要的资源」,「阅读原文」查看交流实录。「文末高能」编辑 | 哈比通过网络获取需要的软件、文档等资源是每个人必须掌握的技能。这篇文...
  •  在上一级的【解决方案】文章中,我们设计出了动态加载资源的业务流程,而这一节,我们就通过一些简单的代码,来实现出业务流程中的效果。  吸取之前文章的经验,如果按照正式项目的规格开发,本篇文章就会非常...
  • REST面向资源架构 RESTful架构详解

    千次阅读 2017-05-25 11:54:36
    1. 什么是REST  REST全称是Representational State Transfer,中文意思是表述... 在论文中提到:“我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一
  • 各大论坛资源汇总

    千次阅读 2019-05-24 10:52:14
    各大论坛资源合集汇总 http://www.erji.net/ 聊耳机的论坛 http://www.cdbest.com/ 聊刻录机,刻录光盘 http://forum.ubuntu.org.cn/ 应该是国内最大的ubuntu论坛了吧 http://bbs.go2eu.com/ 穷游网,撸瑟的国际...
  • 1. 创建游戏物理世界 2. 没了(小若:我噗)   害怕了?不用担心,这太简单了~!   3.0新亮点,史上最简单的物理引擎 在Cocos2d-x3.0里使用物理引擎,会很有快感,因为很多繁琐的东西它都帮我们封装好了。 ...
  • RBAC新解 - 基于资源的权限管理

    千次阅读 2017-01-25 23:07:20
    如果你好奇现实世界有没有被多个系统使用的基于资源的权限控制框架,你可以了解一下Apache Shiro。它是一个java平台的现代权限管理框架。通过它的权限(Permission)概念,Shiro很好地支持基于资源的权限访问控制。 ...
  • 世界各国人口最新排名 - 2011: http://wenku.baidu.com/view/8ab3a508f78a6529647d5349.html 世界各国面积排名国家国土面积: http://wenku.baidu.com/view/95e16c37ee06eff9aef80722.html
  • 十三个世界著名的定律

    万次阅读 多人点赞 2021-02-03 18:52:03
    1、酒与污水定律 把一匙酒倒进一桶污水,得到的是一桶污水;把一匙污水倒进一桶酒里,得到的还是一桶污水。很明显,污水和酒的比例并不能决定这桶东西的性质,真正起决定...农村家庭的爷爷就一直劝,生气的王境泽随即
  • CMMI 知识扫盲篇

    万次阅读 多人点赞 2017-09-09 01:27:44
    大部分软件公司都会申请获得 CMMI 的认证,也会以通过认证为荣,那么 CMMI 认证的意义和目的是什么?怎样可以拿到 CMMI 认证呢?这篇文章为不懂 CMMI 的同学做个常识的介绍,并且将书本和网络上的文本介绍,转化成...
  • 你不可错过的Java学习资源清单

    千次阅读 2018-10-11 22:27:33
    学习Java和其他技术的资源其实非常多,但是我们需要取其精华其糟粕,选择那些最好的,最适合我们的,同时也要由浅入深,先易后难。基于这样的一个标准,我在这里为大家提供一份Java的学习资源清单。 一:Java入门...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 334,329
精华内容 133,731
关键字:

去他的世界2资源