查询语句没有经过测试,暂时做个记录。
1 | { |
查询语句没有经过测试,暂时做个记录。
1 | { |
Spring Boot 2.1.x集成Kafka,其他版本也是类似方法。
在Spring Boot中添加Kafka Client依赖。
1 | <dependency> |
进入此依赖,查看kafka-clients版本号。
1 | <dependency> |
所以在安装Kafka的时候,选择2.0.1版本就可以了。Scala版本选择最高版本就行。
zookeeper单机,Kafka在同一台机器上安装两个实例。
在config/server.properties
里面修改如下属性。
broker.id=0
Broker的id号,第一个实例为0,第二个实例为1。
listeners=PLAINTEXT://:9092
第一个实例用默认端口9092,第二个实例用9093。
advertised.listeners=PLAINTEXT://{host-ip}:9092
第一个实例用默认端口9092,第二个实例用9093。
如果不设置上述暴露给生产者和消费者的地址和端口,可能会出现如下错误:
1 | java.io.IOException: Can't resolve address |
网上有说到解决这个问题的办法是在hosts里面配置主机的ip地址,个人觉得这个办法不是最佳实践。
log.dirs=/tmp/kafka-logs
单机时,这个文件夹得用不同的。
启动zookeeper和kafka我就不在这里讲了。第二个实例启动后可以看到如下信息。
1 | INFO [KafkaServer id=1] started (kafka.server.KafkaServer) |
在application.yml里面需要配置如下:
1 | spring: |
我们再看看默认配置的值。
1 | [16:38:24.889] INFO org.apache.kafka.common.config.AbstractConfig 279 logAll - ProducerConfig values: |
Java代码
1 | @RestController |
通过console-consumer就可以消费消息了。
parent-child关系,类似于nested模型,区别在于,nested objects文档中,所有对象都在同一个文档中,而parent-child关系文档中,父对象和子
对象都是完全独立的文档。
使用场景:子文档数量较多,并且子文档创建和修改的频率高时。
与nested objects相比,parent-child关系的优势有:
更新父文档时,不会重新索引子文档。
创建,修改或删除子文档时,不会影响父文档或其他子文档。
子文档可以作为搜索结果独立返回。
对父-子文档关系有个限制条件:父文档和其所有子文档,都必须要存储在同一个分片中。
建立父-子文档映射关系时只需要指定某一个文档 type 是另一个文档 type 的父亲。 该关系可以在如下两个时间点设置:1)创建索引时;2)在子文档 type 创建之前更新父文档的 mapping。
举例说明,有一个公司在多个城市有分公司,并且每一个分公司下面都有很多员工。
在创建员工 employee 文档 type 时,指定分公司 branch 的文档 type 为其父亲。
1 | PUT /company |
employee 文档 是 branch 文档的子文档。
为父文档创建索引与为普通文档创建索引没有区别。父文档并不需要知道它有哪些子文档。
1 | POST /company/branch/_bulk |
创建子文档时,用户必须要通过 parent 参数来指定该子文档的父文档 ID:
1 | PUT /company/employee/1?parent=london |
当前 employee 文档的父文档 ID 是 london 。如此保证了父文档和子文档都在同一个分片上。
分片路由的计算公式如下:
shard = hash(routing) % number_of_primary_shards
如果指定了父文档的 ID,那么就会使用父文档的 ID 进行路由,而不会使用当前文档 _id。也就是说,如果父文档和子文档都使用相同的值进行路由,那么父文档和子文档都会确定分布在同一个分片上。
在执行单文档的请求时需要指定父文档的 ID,单文档请求包括:通过 GET 请求获取一个子文档;创建、更新或删除一个子文档。而执行搜索请求时是不需要指定父文档的ID,这是因为搜索请求是向一个索引中的所有分片发起请求,而单文档的操作是只会向存储该文档的分片发送请求。因此,如果操作单个子文档时不指定父文档的 ID,那么很有可能会把请求发送到错误的分片上。
1 | POST /company/employee/_bulk |
如果你想要改变一个子文档的 parent 值,仅通过更新这个子文档是不够的,因为新的父文档有可能在另外一个分片上。因此,你必须要先把子文档删除,然后再重新索引这个子文档。