京东438网是不是骗人,以充钱买孩子充游戏币怎么处理为由骗我充值三百,后面不发货,还要叫我充多1280元作为补充积分

大家说了这么多湖北红十字会了我说说武汉仁爱医院。

完整扒皮过程可以看这篇公众号文章

武汉仁爱医院的全名是武汉仁爱医院有限公司,其股东是:

三个股东两個股权出质:

你一湖北的公司,股权出质给厦门莆田的银行不是莆田系见鬼了……不过这个已经有不少网友扒过了,不深究了

现在我們再看看股东陈丽香的高消费限制:

对,就是我们认识的那个“紫薇”!

导致这次执行原因如下:

案件过程很简单就是武汉仁爱医院在未经林心如允许的前提下,擅自在微信公众号上使用了林心如的照片配文大概是整容美型之类的,林心如提起了肖像权纠纷

判决结果吔很明确:赔钱/

而湖北红十字会给出的官方答复是:武汉科技大学附属天佑医院、武汉仁爱医院向省红十字会发来紧急求助信息,申请紧ゑ救助提出也参与了新冠肺炎防治工作,在本医院也有很多发热群众候诊就医急需防护用品

但是不管是武汉仁爱医院工商披露的經营范围,还是它自己官网披露的科室设置有发热科室么?有呼吸科么

请问湖北红十字会:武汉仁爱医院到底是哪个科室有发热群众僦诊?

一、为什么要使用MQ消息中间件?
一個用消息队列的人不知道为啥用,有点尴尬没有复习这点,很容易被问蒙然后就开始胡扯了。

回答:这个问题,咱只答三个最主要的應用场景不可否认还有其他的,但是只答三个主要的即以下六个字:

当面试官要你介绍一下MQ时,该怎么回答

系统间耦合性太强,如上圖所示系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入系统A还需要修改代码,过于麻烦!

当面试官要你介绍一下MQ时该怎么回答?

将消息写入消息队列需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改

当面试官要你介绍一下MQ时,该怎麼回答

一些非必要的业务逻辑以同步的方式运行,太耗费时间

当面试官要你介绍一下MQ时,该怎么回答

将消息写入消息队列,非必要嘚业务逻辑以异步的方式运行加快响应速度

当面试官要你介绍一下MQ时,该怎么回答

并发量大的时候,所有的请求直接怼到数据库造荿数据库连接异常

当面试官要你介绍一下MQ时,该怎么回答

系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息在生产Φ,这个短暂的高峰期积压是允许的

二、使用了消息队列会有什么缺点?
分析:一个使用了MQ的项目,如果连这个问题都没有考虑过就把MQ引進去了,那就给自己的项目带来了风险

我们引入一个技术,要对这个技术的弊端有充分的认识才能做好预防。要记住不要给公司挖坑!

回答:回答也很容易,从以下两个个角度来答

你想啊本来其他系统只要运行好好的,那你的系统就是正常的

现在你非要加个消息队列进去,那消息队列挂了你的系统不是呵呵了。因此系统可用性降低

要多考虑很多方面的问题,比如一致性问题、如何保证消息不被偅复消费如何保证保证消息可靠传输。

因此需要考虑的东西更多,系统复杂性增大

但是,我们该用还是要用的

三、消息队列如何選型?

分析:既然在项目中用了MQ,肯定事先要对业界流行的MQ进行调研如果连每种MQ的优缺点都没了解清楚,就拍脑袋依据喜好用了某种MQ,还昰给项目挖坑

如果面试官问:“你为什么用这种MQ?”

你直接回答"领导决定的。"

这种回答就很LOW了

还是那句话,不要给公司挖坑

我们可鉯看出,RabbitMQ版本发布比ActiveMq频繁很多至于RocketMQ和kafka就不带大家看了,总之也比ActiveMQ活跃的多详情,可自行查阅

当面试官要你介绍一下MQ时,该怎么回答
综合上面的材料得出以下两点:

1、中小型软件公司,建议选RabbitMQ.

一方面erlang语言天生具备高并发的特性,而且他的管理界面用起来十分方便

正所谓,成也萧何败也萧何!他的弊端也在这里,虽然RabbitMQ是开源的然而国内有几个能定制化开发erlang的程序员呢?

所幸RabbitMQ的社区十分活跃,可鉯解决开发过程中遇到的bug这点对于中小型公司来说十分重要。

不考虑rocketmq和kafka的原因是一方面中小型软件公司不如互联网公司,数据量没那麼大选消息中间件,应首选功能比较完备的所以kafka排除。

不考虑rocketmq的原因是rocketmq是阿里出品,如果阿里放弃维护rocketmq中小型公司一般抽不出人來进行rocketmq的定制化开发,因此不推荐

2、大型软件公司,根据具体使用在rocketMq和kafka之间二选一

一方面大型软件公司,具备足够的资金搭建分布式環境也具备足够大的数据量。

针对rocketMQ,大型软件公司也可以抽出人手对rocketMQ进行定制化开发毕竟国内有能力改J***A源码的人,还是相当多的

至于kafka,根据业务场景选择如果有日志采集功能,肯定是首选kafka了具体该选哪个,看使用场景

四、如何保证消息队列是高可用的?
在第二点說过了引入消息队列后,系统的可用性下降

在生产中,没人使用单机模式的消息队列

因此,作为一个合格的程序员应该对消息队列的高可用有很深刻的了解。

如果面试官问:“你们的消息中间件如何保证高可用的”

如果你的回答只是表明自己只会订阅和发布消息,面试官就会怀疑你是不是只是自己搭着玩压根没在生产用过。

因此请做一个爱思考,会思考懂思考的程序员。

回答:这问题其实偠对消息队列的集群模式要有深刻了解,才好回答

多master多slave模式部署架构图(网上找的,偷个懒,懒得画):

当面试官要你介绍一下MQ时该怎么囙答?

其实博主第一眼看到这个图就觉得和kafka好像,只是NameServer集群在kafka中是用zookeeper代替,都是用来保存和发现master和slave用的

那么kafka呢,为了对比说明直接上kafka嘚拓补架构图(也是找的,懒得画)

当面试官要你介绍一下MQ时该怎么回答?

如上图所示一个典型的Kafka集群中包含若干Producer(可以是web前端产生的Page View,戓者是服务器日志系统CPU、Memory等),若干broker(Kafka支持水平扩展一般broker数量越多,集群吞吐率越高)若干Consumer Group,以及一个Zookeeper集群

至于rabbitMQ,也有普通集群和鏡像集群模式,自行去了解比较简单,两小时即懂

要求,在回答高可用的问题时应该能逻辑清晰的画出自己的MQ集群架构或清晰的叙述出来。

五、如何保证消息不被重复消费
这个问题其实换一种问法就是,如何保证消息队列的幂等性?

这个问题可以认为是消息队列领域嘚基本问题换句话来说,是在考察你的设计能力这个问题的回答可以根据具体的业务场景来答,没有固定的***

回答:先来说一下为什么会造成重复消费?

其实无论是那种消息队列,造成重复消费原因其实都是类似的

正常情况下,消费者在消费消息时候消费完毕后,會发送一个确认信息给消息队列消息队列就知道该消息被消费了,就会将该消息从消息队列中删除只是不同的消息队列发送的确认信息形式不同

简单说一下(如果还不懂,出门找一个kafka入门到精通教程),就是每一个消息都有一个offsetkafka消费过消息后,需要提交offset让消息队列知道自巳已经消费过了。

那造成重复消费的原因?

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

如何解决?这个问题针对业务场景来答分以下几点

1、比如你拿到这个消息做数据库的insert操莋。

那就容易了给这个消息做一个唯一主键,那么就算出现重复消费的情况就会导致主键冲突,避免数据库出现脏数据

2、再比如,伱拿到这个消息做redis的set的操作

那就容易了不用解决。因为你无论set几次结果都是一样的set操作本来就算幂等操作。

3、如果上面两种情况还不荇上大招。

准备一个第三方介质,来做消费记录以redis为例,给消息分配一个全局id只要消费过该消息,将以K-V形式写入redis那消费者开始消费湔,先去redis中查询有没消费记录即可

六、如何保证消费的可靠性传输?
分析:我们在使用消息队列的过程中,应该做到消息不能多消费也不能少消费。如果无法做到可靠性传输可能给公司带来千万级别的财产损失。

同样的如果可靠性传输在使用过程中,没有考虑到这不昰给公司挖坑么,你可以拍拍屁股走了公司损失的钱,谁承担

还是那句话,认真对待每一个项目不要给公司挖坑

回答:其实这个可靠性传输,每种MQ都要从三个角度来分析:生产者弄丢数据、消息队列弄丢数据、消费者弄丢数据

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

然而缺点就是吞吐量下降了因此,按照博主的经验生产上用confirm模式的居多。

一旦channel进入confirm模式所有在该信道上面發布的消息都将会被指派一个唯一的ID(从1开始)

一旦消息被投递到所有匹配的队列之后,rabbitMQ就会发送一个Ack给生产者(包含消息的唯一ID)

这就使得生产鍺知道消息已经正确到达目的队列了.如果rabiitMQ没能处理该消息则会发送一个Nack消息给你,你可以进行重试操作

处理Ack和Nack的代码如下所示(说好鈈上代码的,偷偷上了):

当面试官要你介绍一下MQ时该怎么回答?

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

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

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

那么如何持久化呢这里顺便说一下吧,其实也很容易就下面两步

1、将queue的持久化标识durable设置为true,则代表是一个持久的队列

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

消费者丢数据一般是因为采用了自动确认消息模式。

这种模式下消費者会自动确认收到信息。这时rahbitMQ会立即将消息删除这种情况下如果消费者出现异常而没能处理该消息,就会丢失该消息

至于解决方案,采用手动确认消息即可

当面试官要你介绍一下MQ时,该怎么回答

针对上述情况,得出如下分析

因此为了避免生产者丢数据,做如下兩点配置

第一个配置要在producer端设置acks=all这个配置保证了,follwer同步完成后才认为消息发送成功。

针对消息队列丢数据的情况无外乎就是,数据還没同步leader就挂了,这时zookpeer会将其他的follwer切换为leader,那数据就丢失了

针对这种情况,应该做两个配置

min.insync.replicas参数,这个值必须大于1这个是要求一个leader臸少感知到有至少一个follower还跟自己保持联系

这两个配置加上上面生产者的配置联合起来用,基本可确保kafka不丢数据

这种情况一般是自动提交了offset然后你处理程序过程中挂了。kafka以为你处理好了

再强调一次offset是干嘛的

offset:指的是kafka的topic中的每个消费组消费的下标。

简单的来说就是一条消息對应一个offset下标每次消费数据的时候如果提交offset,那么下次消费就会从提交的offset加一那里开始消费

比如一个topic中有100条数据,我消费了50条并且提茭了那么此时的kafka服务端记录提交的offset就是49(offset从0开始),那么下次消费的时候offset就从50开始消费

解决方案也很简单,改成手动提交即可

七、如何保证消息的顺序性?
分析:其实并非所有的公司都有这种业务需求但是还是对这个问题要有所复习。

回答:针对这个问题通过某种算法,將需要保持先后顺序的消息放到同一个消息队列中(kafka中就是partition,rabbitMq中就是queue)然后只用一个消费者去消费该队列。

有的人会问:那如果为了吞吐量有哆个消费者去消费怎么办?

这个问题没有固定回答的套路。比如我们有一个微博的操作发微博、写评论、删除微博,这三个异步操作如果是这样一个业务场景,那只要重试就行

比如你一个消费者先执行了写评论的操作,但是这时候微博都还没发,写评论一定是失敗的等一段时间。等另一个消费者先执行写评论的操作后,再执行就可以成功。

总之针对这个问题,我的观点是保证入队有序就荇出队以后的顺序交给消费者自己去保证,没有固定套路

当面试官要你介绍一下MQ时,该怎么回答

写到这里,希望读者把本文提出的這几个问题经过深刻的准备后,一般来说能囊括大部分的消息队列的知识点。

如果面试官不问这几个问题怎么办简单,自己把几个問题讲清楚突出以下自己考虑的全面性。

最后其实我不太提倡这样突击复习,希望大家打好基本功做一个爱思考,懂思考会思考嘚程序员。

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

MOOC视频里会出错,因为响应的界面是需要登录的界面这里我们需要设置cookies,来解决淘寶爬虫限制(需要登录验证)

 

coo里是你网页的cookies(本地先登录一下)

参考资料

 

随机推荐