总结一下这个月的收获

  上个月,放弃继续学习docker后,立马拿出刚买不久的:《ElasticSearch实战》和《RabbitMQ实战指南》。打算这个月内,把这2本书者过一遍,补补知识广度的短板。7月份开始,要备战成人高考了,留给我的时间不多了。

  先说说es这本书,es这本书还好,通篇都是采用RESTFul请求示例,给我们讲解它的特性。不像那本mq,全是java代码,给我这个phper,造成了一点困扰。es是采用java语言,基于Lucene之上的搜索引擎。所以装es前,需要先安装java环境。同类型的还有Solr,不过es的优点是采用分布式模式。
  es有3个重要的概念:索引、类型和文档,类似关系型数据库里的数据库、表和行。所以,如果使用它的话,就需要把数据“索引”到es中去。内部的数据,是采用倒排索引,也叫反向索引的方式来组织的。在物理设计方面,它把同分片的
主副分片,分别存放在不同的节点上,来构建可靠的集群。即使某个节点宕机,也不会丢失全部数据。比方说:有2组分片,2个节点。他会把主分片a和副本分片b,存放到节点1。而节点2,存放着副本分片a和主分片b。
  对了,还有一个重要的概念是:映射。类似关系型数据库里的表定义,可以事先定义存储数据的字段类型。并且,还可以在第一个索引数据时,自动获取数据的类型,去“
动态映射 。映射的功能,远远不止定义数据类型那么简单。它还可以,指定某个字段的分析器类型,文档间的父子关系等。
  es有着丰富的搜索功能,默认是采用相关度排序,还可以自定义一些指标,去影响相关度,也可以指定排序字段。字段类型也比较简单,有:字符串、数值、日期、布尔。让我印象最深刻的,还是它的几个分词方式:N元语法、侧边N元语法和滑动窗口。巧妙地利用了,不同维度的字符截取方式来分词。

  随便写一写,都3点了,RabbitMQ还没开始呢!可怕!

  主流的MQ有很多,如:RabbitMQ、Kafka、ActiveMQ、RocketMQ。在阅读RabbitMQ之前,我本来在看RocketMQ,结果没看几页,就发现全部都是java示例代码,我就直接放弃了。后来,买了本RabbitMQ,结果发现还是java示例代码,最后只能硬着头皮去读。RabbitMQ是基于Erlang语言开发的,所以需要先安装Erlang环境,再安装RabbitMQ。消息中间件可以用于项目的解耦、冗余、削峰、异步通信,并提高扩展性和可恢复性。它一般有两种传递模式:点对点模式和发布/订阅模式,还可以实现RPC(远程过程调用)。
  RabbitMQ有几个重要的概念:生产者、消费者、交换器、路由键和队列。
  生产者好比寄信人,而消费者就是收信人。消息好比信件,而队列就是邮筒。生产者把消息放入队列,消费者就可以通过队列拿到消息。但是,一个城市只有一个邮筒(队列)是不够用的,所以需要邮局(交换器)去管理多个邮筒(队列)。而路由键就好比是地址,寄信的时候需要填写地址(路由键),而收信人所在的地方,也需要编排一个地址(绑定路由键)。

个人建议:先读官方文档的入门教程,因为我在书上12页的生产者代码中,也看到给队列绑定交换器,绑定路由键,比较费解。网址: https://www.rabbitmq.com/tutorials/tutorial-four-php.html

  交换器一共有4个类型: direct、topic、headers和fanout。
  使用fanout类型的交换器时,他会把收到的所有消息广播到它知道的所有队列中;
  使用direct类型的交换器时,他只会把收到的消息,广播到路由键相同的队列中;
  使用topic类型的交换器时,他跟direct类似,但他支持模糊匹配;
  使用headers类型的交换器时,他不依赖路由键匹配,而是根据消息内容中的headers属性进行匹配;

  对了,还有两个重要的概念:连接和信道。无论你是消费者,还是生产者,在操作消息的时候,都需要先建立连接。建立和销毁TCP连接是非常昂贵的,而信道是为了模拟多线程功能,而不去创建多个TCP连接,这样有利于提升性能。