邢台做wap网站费用,类似wordpress的网站,wordpress头像加V,电商网站建设精准扶贫的目的什么是消息队列#xff1f;用哪个消息队列#xff1f; 来了来了#xff0c;消息队列系列总算来咯。对于搜索引擎相关的知识大家消化的怎么样呀#xff1f;其实对于搜索引擎来说#xff0c;我们学习的内容还是挺全面的#xff0c;也算是比较深入了。而对于消息队列来说用哪个消息队列 来了来了消息队列系列总算来咯。对于搜索引擎相关的知识大家消化的怎么样呀其实对于搜索引擎来说我们学习的内容还是挺全面的也算是比较深入了。而对于消息队列来说我不准备写得太深入因为对于这个东西实战并不算多主要的原因咱们在今天这篇文章结束的时候再详细的来说吧。 先来说概念到底啥是消息队列那么多种消息队列工具或者叫消息队列中间件我们应该选择哪个呢我将以哪个作为主讲呢咱们一一来看。 消息队列 说消息队列之前不得不先说一下队列。跟过我之前数据结构系列的同学们对队列应该不陌生吧。排队上公交的例子还记得吧队列的特点最简单的理解就是通过数组数据从数组的一端进入比如从数组尾部添加数据或尾指针然后从另一端头部或头指针出。与之对应的还有一种叫做栈的东西正好是和它反过来的栈是从相同的一头进出数据。将队列想像成一根绳子将它平铺后就有左右两端我们可以在左边续上新的绳子这叫入队然后从右边剪掉一部分这叫出队。同样的也可以右进左出反正只要不是在一边出的就可以看做是队列。 链表和数组都可以实现队列而且 PHP 中的数组函数也可以非常方便地实现队列这种数据结构。队列在树和图的遍历中还可以实现广度遍历的效果。这些内容如果大家不记得了还是要再复习一下哦。 消息队列英文名是 Message Queue 简称 MQ 。很明显它是将“消息”放到队列中。是的不管别的什么高大上的定义只要你了解队列的含义然后把消息当成是要加入队列的数据或者说把队列里面的数据称为消息这就是消息队列。 最早的消息队列其实是应用在操作系统中作为进程间通信的一种方式存在的。这一块的内容我们之前在 Swoole 系列进程间通讯相关的内容中也讲过。而通常大家所说的消息队列则是一种中间件是一种独立的存储型队列系统不仅可以跨进程跨应用通信还可以跨服务器远程通信。简单点理解我们可以写多个系统然后连接同一个数据库不同的系统通过读取数据库里的数据就可以实现这些系统之间的通信。而消息队列中间件系统也是这样的可以独立以及分布式部署的像数据库一样的东西。它以队列这种数据结构为基本载体让数据以有序的、有流向的方式保存起来。所有的应用、服务、程序都可以读写这个中间队列库中的数据而这些数据就被称为消息。 通常消息队列最典型的应用就是由一个应用程序作为生产者而另一个应用程序作为消费者。当然也可以同一个程序即是生产者也是消费者。生产者向队列中添加数据消费者从队列中读取数据这个添加和读取的顺序都是遵循队列的基本特征的左进右出或右进左出就可以了。一般是先进队的数据先被取出来对应的一个计算机名词就是 FIFO First In First Out栈是 LIFOLast in First out。当然也有优先队列可以改变这种顺序这个也是非常常见的一个概念。 消息队列本质上就是一个大的缓冲区只受磁盘和内存容量的限制可以让不同的生产者向队列中发送消息也可以让不同的消费者从队列中获取数据。因为这个特点它可以帮我们做很多平常写程序很难做到的事情我们最后一个小节会专门讲到消息队列的用途。 好了其实消息队列的概念大家或多或少都应该了解咱们也不多废话了。接下来就看看现在市面上各种消息队列工具吧。 各种消息队列工具 之前我们在讲搜索引擎时提到过不少搜索引擎工具。比如说 ES、Sphinx、Solr还有我们主讲的 XS 以及纯 PHP 实现的 TNTSearch 。是不是感觉都快有选择恐惧症了。说实话在搜索引擎领域真的不用选择恐惧大项目直接 ES 中小型项目 XS 小型项目 TNTSearch 没毛病。而对于消息队列那才真的是让你选择焦虑。 首先现在最火的大名鼎鼎的 Kafka 你要是没听过它的大名就相当于在搜索引擎领域不知道 ES 在数据库领域不知道 MySQL 一样。但是相对来说它的领先地位远达不到 ES 的一骑绝尘和 MySQL 的大比重。不过它的增长势头也一直没有停歇。同时它还是配合大数据的最常用的消息队列天生分布式并且需要使用 Zookeeper 来做分布式部署。速度极快单机最高每秒百万级数据吞吐时效性毫秒级。 然后就是 RabbitMQ 另一个大佬使用 Erlang 开发的消息队列系统。在 Kafka 没有大火前兔子队列应该是消息队列系统的大哥大。完整的确认及持久化机制让他的安全性非常高。各种开发语言组件异常丰富自带的管理界面也非常好用。单机吞吐量万级时效性微妙级。 两个大哥大但是它们并没有垄断还有 RocketMQ 和 ActiveMQ 一个是阿里开源的类似 Kafka 的不过仅支持 Java 。另一个是老牌消息队列系统但也是 Apache 下的顶级项目。 别忘了Redis 也是有消息队列功能的所以在这一领域Redis 是绝对有资格来分一杯羹的。 上面五个是非常常见的消息队列系统也是非常出名的但是还有一些比较小众的消息队列系统。说小众其实更确切的说是我在干 PHP 这些年中接触过的一些 PHP 项目中使用过的消息队列系统。 第一个也是比较古老的但非常简单的 SQS 全名是 简单队列系统 有用过的小伙伴举手现在应该叫 Amazon SQS 了吧是 Amazon 提供的一个云服务还是这个开源组件就是 Amazon 来维护了我也不清楚当时我们的是自己搭起的服务。这个东西真的就是一个完全的队列数据结构的网络存储实现貌似没有别的什么特别的功能。太久之前用过了我都记不清细节了。 另外一个叫 Beanstalkd 用过 Laravel 框架的同学一定见过这个单词吧。Laravel 的队列组件中直接可用的三个驱动一个是 Redis 一个是 Amazon SQS另一个就是 Beanstalkd 。这个消息队列我没有实战用过但我知道它是一个非常轻量级的功能很完整的消息队列系统。如果说 Redis 中的队列功能只是一个附属功能不是一个完整的消息队列系统级实现的话那么 Beanstalkd 则是一个非常标准的消息队列实现。据说它就像是一个轻量级的 RabbitMQ 。反正我是没用过也没研究过啦有用过的小伙伴可以评论区留言分享一些学习资料哦。 我们的选择 上面随便一说就是一堆。 Kafka、RabbitMQ、RocketMQ、ActiveMQ、Redis、SQS、Beanstalkd 七个。说实话还有更多的没列出来呢。前面五种是比较通用的也比较常见的。后面两个则是在 PHP 项目中可能会见到的。 那么我们后面要讲解的要学习的是哪个呢 其实呀在这个系统中我只是想简单地介绍一下消息队列中的一些基本概念并不打算像之前的系列文章那样深入的就某一种软件框架进行深入学习。为什么呢 一是我最大接触过的项目是一个游戏的统计分析系统每天最高3000W的日志量1000W日活最高并发单机2W连接三台应用服务器接收请求入队4台消费者处理队列数据。生产者和消费者都是使用 Swoole 要不应用服务器抗不住。三台服务器同时还提供广告、数据统计分析和后台的服务。这种情况下也只是使用 Redis 的队列就搞定了而且还是只用到最简单的 List 功能下的队列效果。配置就是一台 4G 容量的单机阿里云 Redis 除了日志数据之外也提供上述其它应用的缓存服务。也就是说仅仅是这样配置的一个 Redis 就能抗住我所经历过的最大量的项目所以我是实在不敢想象要用到 Kafka 这样的分布式消息队列的系统得有多大的数据量和并发数。 二是对于大部分的 PHPer 来说可能连我上面的这种项目经历过的人都少所以对于消息队列在高并发处理下的需求并不高。大部分的需求只是处理一些异步任务比如说电商的下单之后的邮件、短信、消息通知之类的功能。对于这类功能来说Redis 其实并不合适前面也说过它是有队列功能但它并不完整。这样的功能其实用 RabbitMQ 是非常合适的。 好了结果也出来了吧咱们后续学习的内容以消息队列的概念和几种应用形式为主。使用的工具就是 RabbitMQ 和 Redis 。关于这两个系统具体的安装以及详细的 API 咱们都不会详细地说毕竟不是以软件工具的学习为主。 和之前的搜索引擎系列不同当时我们是通过详细的学习 XS 的各种功能来引出搜索引擎的各种概念然后通过概念的了解大家再看别的搜索引擎就会感觉非常轻松了。但在消息队列中本身概念就不多软件的功能也都是围绕着这些概念的。而且最主要的功能和概念就是最简单的最普通的那种像数据结构和算法里的队列效果。因此我们在这个系列中就以消息队列的各种概念和简单的 RabbitMQ 及 Redis 的示例来进行学习。如果对这些工具的具体 API 有疑问可以直接去相应的官网查找相关的资料即使是 RabbitMQ 的官方文档其实内容也真的不算多。 后续演示的内容只需要单机的 RabbitMQ 和 Redis 就可以了。我这里是使用 Docker 安装的 RabbitMQ 然后 Mac 系统的 brew 工具安装的 Redis 大家也可以先提前准备好哦。需要安装 PHP 的 Redis 扩展以及 Composer 安装 php-amqplib/php-amqplib 这是 RabbitMQ 的 PHP 扩展包。 学习的内容以我日常接触过的实际应用和消息队列的核心概念为主因此不会是某个单独软件工具的具体教程。就是再强调一遍上面说过的我们是学习功能和概念的不局限于某个具体的软件。这些功能和概念市面上所有的消息队列工具都有提供的。如果你要更加深入地学习某个队列应用的话可以去查找相关的文档比如说 RabbitMQ 的入门手册就有各个语言版本的 https://www.rabbitmq.com/getstarted.html 。这个手册中的这几个例子浅显易懂非常经典是第一推荐学习资料。如果你完全没接触过 RabbitMQ 也没关系因为每篇文章都会有 RabbitMQ 和 Redis 的实现。对于 Redis 来说功能比较简单查阅 Redis 的官方文档即可。而且之前咱们也已经一起学过 Redis 系列了相信一直跟着我学习的同学都是没问题的。同时我们还会通过 Laravel 框架中的队列功能来看看在 Redis 中框架是如何实现本身 Redis 所不具备的各种队列功能的。这也是我们的重点学习内容整个系列也就六篇文章围绕的还是 PHPer 们在应用队列时的一些问题和相关概念。内容不多但相信一起学习完之后大家对消息队列会有一个更加全面的认识。 有不会安装的小伙伴可以评论区或者公众号留言也可以加我微信哦 消息队列能干什么 最后咱们再说一下消息队列能干啥。这个其实也就是简单说下毕竟相关资料太多了。而且在上面的例子中我就已经说了两种应用场景了。 流量削峰高并发场景下的业务处理。就是我前面说的做统计系统的功能。客户端上报的日志上传上来后直接入库中间可能会有各种逻辑判断请求并发量高了之后不仅是应用服务抗不住数据库可能也抗不住。于是先进队然后再由消费者将数据分拆并进行初步整理后入库以便于后续的分析使用。大数据系统大部分也是在干这事Kafka 的分布式高并发能力基本都是头部中大型互联网企业才能用得到的。还有一种情况秒杀场景下也会使用消息队列来应对瞬间的超大流量。应用解耦就是我前面说过的下单之后要向商家发邮件、短信、通知消息而且也有可能也要同步向客户发送。如果是同步操作可能会等半天而且万一邮件发送失败了要不要报错呢用户界面直接显示报错还是算下单成功呢使用消息队列之后咱们下单就正常操作完订单表就好了下订单的代码不用再写发送信息啥的把订单信息放到消息队列让对应的邮件服务、短信服务、通知服务从队列中拿到数据再各自去处理不影响主业务的流畅完成。异步通信综合上述两个功能其实就是让我们的系统主流程可以快速完成其它的流程让别的程序异步执行。所有系统也可以根据队列中的内容来进行通信这也是消息队列在操作系统中最原始的功能。 说人话总结一下消息队列应对的场景最主要的问题就是解决大流量、大数据量下处理变慢或者直接崩溃的问题让数据能够有个缓冲或者分散处理。而对于我们 PHPer 来说这一块其实很多同学的接触有限。而且就像上面我说过的我接触过的最大流量也只是通过一个很低配置的 Redis 中的不完全队列功能就解决了。所以说对于消息队列我的心得确实也只能是点到为止了。 总结 好了总结一下吧今天咱们就是简单聊了聊啥是消息队列有哪些消息队列以及后续我们学习的主要方向。内容非常简单同时这个系列也不是很复杂很冗长的大家可以轻松对待哦。