高端网站建设设计公司有哪些,台州网站建设网站推广,浙江企业网站建设,2345网址大全设主页访问先吐槽我真的写技术文章写到怀疑人生#xff0c;我翻看历史发文记录#xff0c;只要我一本正经的写的技术文章#xff0c;都没人看#xff0c;但是#xff01;一发闲扯淡的内容#xff0c;阅读量肯定是技术文的好几倍#xff08;读者爸爸们别这么搞嘛#xff09;这说明… 先吐槽我真的写技术文章写到怀疑人生我翻看历史发文记录只要我一本正经的写的技术文章都没人看但是一发闲扯淡的内容阅读量肯定是技术文的好几倍读者爸爸们别这么搞嘛这说明啥说明学习还是太枯燥无趣了但是你想想每天就网上看闲扯淡的文章这咋能进大厂嘛对吧。再接受几次这样的打击我都不想写技术文章了。哎不过我也就嘴上说说我还是会坚持写下去的。反正你们有没有认真看我不知道我写完一遍这个文章每个知识点细节我都滚瓜乱熟了因为都是我一个字一个字敲出来的。开始正文吧21世纪的流水线工人消息队列是一定要会的。我真的不能再贴心了背景image-20200420194331765分布式微服务系统下凡是可以“排队”去做的事情都可以使用消息队列。网上买东西同样也需要“排队付款”但是有人说我点确认付款后马上就显示成功了没感觉到排队呀其实在后台系统中是排了只不过排队的时间对于人来说有点短可能1-2秒就结束了但是对于计算机来说这1-2秒的时间很长了。大型分布式系统建设中消息队列主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。消息发布者只管把消息发布到 MQ 中而不用管谁来取消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。Web应用程序毫无疑问有大量的代码执行HTTP请求/响应周期的一部分。这适用于更快的任务耗费数百毫秒内或更少。然而,有些处理,还需要耗时更多甚至最终会是一两秒钟缓慢的同步执行在如此长时间的调用流转中肯定有一些调用是可以不同步的如下单送积分用户下单是最主要的送积分的操作可以异步去做订单支付成功给用户的短信通知返回支付订单进入下一环节更更好短信通知可以异步去发送为了应对诸如此类的异步操作消息队列这门技术应运而生。message-queue-example在计算机科学中消息队列Message queue是一种进程间通信或同一进程的不同线程间的通信方式。实际上消息队列常常保存在链表结构中。[2]拥有权限的进程可以向消息队列中写入或读取消息。目前有很多消息队列有很多开源的实现包括JBoss Messaging、JORAM、Apache ActiveMQ、Sun Open Message Queue、RabbitMQ[3]、IBM MQ[4]、Apache Qpid[5]、Apache RocketMQ[6]和HTTPSQS。[7]说了这么多没用的消息队列到底在企业里怎么用的我就直接上两段代码吧发送一条消息demopublic class MqProducer {private final Logger LOG LoggerFactory.getLogger(MqProducer.class);Resourceprivate Producer payProducer;public void sendPayMsg(String msg) {try {LOG.debug(send msg:{}, msg);payProducer.send(msg);//发送出去一条消息。} catch (MQException e) {LOG.error(mq消息异常 message:{}, msg, e);}}
}
接收一个消息demopublic class DemoConsumer {/*** 注意服务端对单ip创建相同主题相同队列的消费者实例数有限制超过100个拒绝创建.* */private static IConsumerProcessor consumer;public static void main(String[] args) throws Exception {Properties properties new Properties();properties.setProperty(ConsumerConstants.SubscribeGroup, dache.risk.log.queue.v2);// 创建topic对应的consumer对象注意每次build调用会产生一个新的实例consumer KafkaClient.buildConsumerFactory(properties, topic.xxx.xxx);// 调用recvMessageWithParallel设置listenerconsumer.recvMessageWithParallel(String.class, new IMessageListener() {Overridepublic ConsumeStatus recvMessage(Message message, MessagetContext context) {//TODO:业务侧的消费逻辑代码try {System.out.println(message[ message.getBody() ] partition message.getParttion());} catch (Exception e) {e.printStackTrace();}return ConsumeStatus.CONSUME_SUCCESS;}});}
}
消息长什么样子{businessType:1,cityId:10,ctime:1567426767077,dataKey:20190902,logType:1,phone:13212341234,uid:12345678,userType:1,uuid:32EA02C86D78863}
代码呢就是普通的java代码只不过引入了一个kafka的jar消息就是json串使用消息队列真的就这么点代码剩下的内容都是业务代码了。新手关注消息队列主要关注两个最重要的概念就行了一个是生产者一个是消费者两者的关系和我们日常发短信一样短信是通过手机号发送接收系统间消息是通过topic可以理解成手机号。Producer消息的生产方如支付系统确认用户已经支付支付系统要通知订单系统和物流系统支付系统就是生产者。Consumer消费的接收方Producer 的案例中物流系统就是消费方前两个都比较简单我就不多说了。Topic每条发布到MQ集群的消息都有一个类别这个类别被称为topic可以理解成一类消息的名字。所有的消息都以topic作为单位进行归类。日常开发中需要关心哪些指标1.生产消息数目每分钟几百几千个都正常水平吧业务繁忙的每分钟几万几十万也是有的image-202004201933503712.消息延迟情况延迟越低越好啦几百毫秒正常水平。image-202004201935407663.消息积压数这个当然是要0了如果遇到消费端服务器上线可能会有段时间积压正常这个指标日常应该都是0才对。image-20200420194052328为什么使用消息队列开头不是说了排队能解决一个问题就是削峰意思就是流量洪峰来了收银员结账速度依旧是一样的不会被累死还有两个重要的概念就是解耦、异步使用消息队列有什么缺点呢这个新手也一定要知道啦因为面试官会问。消息丢失问题 任何系统不能保证万无一失比如 Producer 发出了10000条消息Consumer 只收到了 9999 个消息有1个丢了Consumer 能否接受丢一条如果是订单成功短信可以接受丢一条就是有一个顾客没有通知到已经发货但货还是发出去了如果是支付系统用户已经付款却因为消息丢失没有通知到订单或物流系统那恐怕顾客要找你麻烦了。消息重复问题如 Producer 发出了10000条消息Consumer 只收到了 10001 条消息有一条是重复的业务能否接受一条重复的消息这个是作为系统设计者要考虑的问题。消息的顺序问题如 Producer 发送顺序是123Consumer 收到的消息是132要考虑消费端是否对顺序敏感。一致性问题 如消息丢失问题真的发生且无法找回会造成两个系统的数据最终不一致如果消息延迟会造成短暂不一致。ActiveMQ vs Kafka vs RabbitMQRabbitMQ、Kafka和ActiveMQ都是用于提供异步通信和解耦进程(分离消息的发送方和接收方)的消息传递技术。它们被称为消息队列、消息代理或消息传递工具。RabbitMQ、Kafka和ActiveMQ都有相同的基本用途但它们的工作方式不同。Kafka是一个高吞吐量的分布式消息传递系统。RabbitMQ是一个基于AMQP的可靠消息代理。ActiveMQ和Kafka都是Apache的产品都是用Java编写的RabbitMQ是用Erlang编写的。进BAT你就研究这其中一个就可以了数量不在多重点是深度。ActiveMQKafka和RabbitMQ有哪些替代方案这些在国内都不是很常用新手了解一下就可以了反正知识广度眼界是有了。Apollo在现有REST API的基础上构建一个通用的GraphQL API可以快速发布新的应用程序特性而无需等待后端更改。IBM MQ它是一个消息传递中间件可以简化和加速跨多个平台的不同应用程序和业务数据的集成。它提供了经过验证的企业级消息传递功能能够熟练而安全地移动信息。ZeroMQ扩展性好开发比较灵活采用C语言实现实际上他只是一个socket库的重新封装如果我们做为消息队列使用需要开发大量的代码Amazon SQS关于消息队列的常见面试题为什么使用消息队列消息队列有什么优点和缺点那为什么Kafka的吞吐量远高于其他同类中间件比较重要的关键字吗比如ProducerConsumerPartitionBroker你都是怎么理解的参考资料Thorough Introduction to Apache Kafka推荐一本书《深入理解Kafka核心设计与实践原理》微信读书就可以免费阅读。