使用Neo4j Streams实现与Kafka的实时消息集成【1】- Sink模式

Neo4j Streams在线文档:https://neo4j.com/docs/labs/neo4j-streams/current/overview/ 

一、背景介绍

在许多的图数据库应用场景中,用户都希望将Kafka和其他流解决方案与Neo4j集成,以实现将其他数据源将数据实时更新到图中,或将图数据库中的更新事件(更改数据捕获 - CDC)发送到事件日志以供以后使用。

使用Neo4j Streams实现与Kafka的实时消息集成【1】- Sink模式_第1张图片

上图中,对应(1),社交媒体网站即时将用户互加好友的事件发送到Kafka上特定主题,然后更新在Neo4j中的社交网络图;对应(2),更新的社交网络图谱会产生新的推荐内容,又通过Kafka以提醒或消息的形式发送给用户。

为此,Neo4j发布了Streams扩展组件。

Neo4j Streams可以在两种模式下运行:

  • 作为Neo4j插件,支持三种模式:

    • Neo4j Streams Source:为图数据库事务事件处理程序,它将数据发送到Kafka主题;
    • Neo4j Streams Sink:通过模板化Cypher语句将来自Kafka Topic上的数据保存到Neo4j中;
    • Neo4j Streams Procedures:提供两个过程 1)streams.publish,它用来将自定义消息从Neo4j以数据流方式发送到Kafka主题中,以及2)streams.consume,用来接收Kafka上给定主题的消息。
  • 作为Kafka Connect插件:Confluent平台的插件,允许通过Cypher查询将数据从Kafka主题提取到Neo4j中。目前,它仅提供接收器功能。

有经验的Neo4j用户可能会更喜欢将软件作为Neo4j插件运行,Kafka管理员则可能更喜欢使用Kafka Connect方法。本文将介绍Neo4j插件的Sink模式。

二、安装Neo4j Streams插件

Neo4j Streams是运行在数据库服务器上的应用扩展,以JAR包的形式发布。

  • 从https://github.com/neo4j-contrib/neo4j-streams/releases/latest下载最新版本的jar
  • 将其复制到$NEO4J_HOME/plugins并配置相关连接

关于Neo4j的数据库服务扩展及其开发,可以参见本人的系列文章《服务器扩展指南》,或者最新出版的《Neo4j图数据库扩展指南 - APOC和ALGO》。

三、配置Kafka Sink模式

在neo4j.conf中添加以下行:

# Kafka configurations go here

# kafka zookeeper服务地址和端口
kafka.zookeeper.connect=localhost:2181
# kafka队列服务地址和端口
kafka.bootstrap.servers=localhost:9092
# 开启Sink执行模式
streams.sink.enabled=true
# 定义从TestTopic上读取的消息的处理方法
streams.sink.topic.cypher.TestTopic=MERGE (n:Person {id: event.id}) ON CREATE SET n += event.properties
# 当收到错误消息内容时选择忽略。如果不设置,读取到格式不合法的消息时会暂停。
streams.sink.errors.tolerance=all
# 开启错误日志
streams.sink.errors.log.enable=true
# 在日志中包含消息内容
streams.sink.errors.log.include.messages=true

streams.sink.topic.cypher.TestTopic 配置选项定义了当Neo4j Streams收到Kafka上的主题TestTopic中的消息时对应执行的Cypher查询。TestTopic上消息的格式如下:

{  "id":"1",
   "properties":{
      "name":"Smith",
      "dob":19800101
   }
}

event变量是对TestTopic上消息的引用。当Neo4j收到该消息后会创建Person节点,并将消息中数据内容保存到节点的属性中。

四、其他重要内容

如果是在容器中运行Kafka,可以在一个Linux (例如CentOS)容器中先安装JDK 1.8,然后安装Kafka。

在Kafka server配置文件并做以下修改:

vi ~/kafka/config/server.properties

delete.topic.enable=true
# In order for host to see the service, need to change to IP. localhost would work here.
advertised.listeners=PLAINTEXT://127.0.0.1:9092

通过指定advertised.listener为本机地址,是的宿主机可以访问Kafka服务。

最后,在启动Linux / Kafka 容器时要指定端口映射:

>docker run --name kafka -d -p9092:9092 -p2181:2181 --memory 5g docker/kafka-2.5:latest

建议Kafka有至少4GB内存。

 

 

 

你可能感兴趣的:(Neo4j高级应用技术专题,图数据库,Neo4j,neo4j,kafka,stream,实时事件,消息集成)