Neo4j_嵌入模式&服务器模式

  1. 使用模式概述

    引进服务器模式背后的主要驱动因素是对支持其他非基于JVM的客户的需求。在服务器模式下,Neo4j数据库以自己的进程运行,客户端通过它的专用基于HTTP的REST API与其对话。

    Neo4j_嵌入模式&服务器模式_第1张图片

  2. 嵌入式模式

    嵌入式模式并不是指硬盘上的实际物理数据库嵌入到你的应用程序中,而是嵌入到Neo4j引擎(类和相关的过程)直接运行和管理Neo4j数据库。嵌入式模式意味着你的应用程序和Neo4j代码将会驻留和运行于同一个JVM。嵌入式模式需要适当的库(JAR文件)捆绑或当应用程序开始时你的应用程序可用这 个库。然后,通过实例化GraphDatabaseService接口上的适当实例获得对库的访问后,就该由你的应用程序负责了。然后,你的应用程序就能够利用这个引用与Neo4j交互

    Neo4j_嵌入模式&服务器模式_第2张图片
    其他基于JVM的集成:

    Neo4j_嵌入模式&服务器模式_第3张图片

  3. 服务器模式

    如与许多其他的基于服务器的设置,客户端需要某个机制与服务器流程进行交互,在Neo4j的情况下,这是通过使用明确定义的,然而是可扩展的基于HTTP的REST API获得的。
    一个典型的具有通过标准的REST API访问客户端的Neo4j服务器设置:

    Neo4j_嵌入模式&服务器模式_第4张图片

  4. 权衡选项
    Neo4j的嵌入式模式与服务器模式的优点和缺点:

    Neo4j_嵌入模式&服务器模式_第5张图片

  5. 对架构的考虑

    ①语言
    嵌入式模式仅限于使用Java或其他基于JVM的语言之一;而服务器模式能够处理任何的能与HTTP对话的客户端。

    ②关注点的分离:对应用关注VS对数据库关注
    社交网络应用程序的两种可能规划情况:嵌入式和服务器模式

    Neo4j_嵌入模式&服务器模式_第6张图片
    ③对硬件的考虑
    为了使Neo4j的操作和功能尽可能保持有效,理想的情况是需要一台强壮的电脑,具有许多内存和足够快的磁盘。

  6. 对性能的考虑
    性能是嵌入式模式和服务器模式不同的关键问题。当通过本机的Java API相对于REST API做一组相同的操作直接比较运行的时间时,嵌入式模式的Neo4j总会胜过服务器模式的Neo4j。这是由于增加的延迟和相关的通过网络的调用。
    当创建新节点时嵌入式模式相对于服务器模式的性能原始结果:

    这里写图片描述
    当创建新节点时嵌入式模式相对于服务器模式的扩展结果:

    这里写图片描述
    作为一个一般的规律,对服务器模式,尤其是REST API,在性能 方面会降低很多,这是由于基于网络的调用需求,但这并不意味着它应该被简单地排除在外。有相当多的可选方式和方法可以改进Neo4j在服务器模式的性能使其达到可接受的水平。

  7. 其他需要考虑的事项

    ①REST API:支持的数据格式
    REST API当前仅支持JSON和HTML作为数据交换格式。如果你喜欢用XML或其他一些格式,唯一方式是使用非托管扩展,这需要定义你自己的REST接口访问数据库和与数据库交互。

    ②事务
    Neo4j是一个完全兼容ACID的数据库。当使用嵌入式模式时,这是一个相当简单的命题,但是对于服务器模式,默认情况下,每一个HTTP请求被当作单个事务。这意味着,例如,如果你的所有处置都是使用本机 REST API,你将不能创建两个节点作为单个事务的部分行为(本机REST API需要两个分离的HTTP POST请求,这将作为两个分离的事务)。
    在服务器模式中处理事务场景的方法包括以下几种:
    ·使用Cypher端点。
    ·使用REST事务端点。
    ·使用服务器插件或非托管扩展。
    ·使用批处理操作。
    根据具体情况,你可以定义一个单一的Cypher声明,它能够在一个事 务调用中执行多个操作。另外,也有一个事务REST端点,允许你在事务的范围内,通过多个HTTP请求执行一系列Cypher声明。具有了这个选项,客户端显式地通过专 用的REST端点发出提交或回滚的指令。
    服务器插件和非托管扩展使你可以编写服务器端代码获取数据在单个HTTP请求中创建节点,然后在服务器端确保在单个事务中创建这些节点。Neo4j也提供称为批处理操作(batch operation)的功能,允许你通过单个HTTP调用发送成组或成批的低级指令,当在服务器端执行时,所有的批处理指令被当作一个单个单位执行。

  8. 充分利用服务器模式
    ①避免细粒度的操作
    作为一个一般的规则,当通过网络执行任何类的操作时,应该尽量减少执行那个操作需要的网络跳跃数,并且这一相同的原理也适用于使用 REST API方式。本机的、低层REST API操作是非常细粒度的,一般是在任意时间对单一节点或关系的操作。如果使用不当,它们能产生大量的不必要的网络流量。
    除了只使用具有可发现能力的低层REST API来获取数据,你应该考虑下面可能导致非常少的网络调用和更好性能的选项。
    ·使用Cypher REST端点。
    ·使用遍历REST端点。
    ·创建一个服务器插件或非托管扩展返回结果。
    为了创建数据,考虑这些选项:
    ·使用Cypher API中的变更功能。
    ·使用REST批处理API。
    ·创建一个服务器插件或非托管扩展执行任务
    如果你是在使用具有超媒体驱动方法的本机REST API获取在例题场景
    中需要的数据,你将需要一个总数为602个的网络调用以实现这个目标。假设Neo4j服务器在局域网上运行在端口7474,你需要做以下的事情:
    ·在http://localhost:7474/db/data/node/0上做1次GET获取Adam的可用选项和数据的初始信息。
    ·在http://localhost:7474/db/data/node/{nId}/relationships/all/IS_FRIEND_OF上做1次GET获取 Adam所有进和出的IS_FRIEND_OF关系列表
    ·在http://localhost:7474/db/data/node/{nId}/properties上做600次GET获取第一次调用返回的每一个关系结构(将有600个条目)(因为有600个直接朋友)。然后你将使用最终的URI构建下一个调用,这将返回结束节点(朋友)的所有属性。在每一次的调用中返回的JSON可以被解析和用于仅仅返回那些以J开头的姓名。

    Neo4j_嵌入模式&服务器模式_第7张图片

    ②使用Cypher
    Neo4j REST API为你提供了通过对指定的负责响应查询的REST端点发布适当的查询或声明和参数对服务器运行任意Cypher声明。假设你具有了所有的需要创建查询或声明的所有信息,这将只需要一次网络调用。使用从请求服务根URL返回的响应,相对于Cypher键定义的URL提供进入点用于发送Cypher查询和声明到服务器。

    Neo4j_嵌入模式&服务器模式_第8张图片
    ③服务器插件
    服务器插件提供了一个卸载一些处理密集型逻辑到服务器的机制,而不是把所有的都放在客户端运行,那样就会在完成同样的事情时多次请求,使得数据来回流动。服务器插件有一些像关系数据库中存储的程序过程。服务器插件专门设计用于扩展已有的REST API返回的节点、关系或全局图形数据库的选项。
    要写一个服务器插件,你需要首先决定目标是什么或要扩展什么(节 点、关系或图形数据库选项),然后按照下面的步骤:
    1)写一个扩展ServerPlugin类的类。
    2)确保服务器插件类的名字完全合格并在文件 org.neo4j.server.plugins.ServerPlugin列表中。
    3)确保插件类和文件是JAR文件,并且放在Neo4j服务器的类路径中。4)通过发现然后调用适当的REST URL访问这些函数。

    Neo4j_嵌入模式&服务器模式_第9张图片
    ④非托管扩展
    如果你需要完全控制你的服务器端的代码,那么非托管扩展可能正是你要找的。与服务器插件仅允许你在特定的点增强已有的REST API不同,非托管扩展实质上允许你定义自己的特定域REST API。不仅仅是处理节点和关系。
    Neo4j通过允许部署任意的JAX-RS(专对REST的网页服务Java API)类到服务器使得这个成为可能。JAX-RS提供了一组API,这组API是为了使开发者开发REST服务成为一件很简单的事而提出的。一般来说,你通过一组注释定义一个Java类,绑定这个类到Neo4j服务器内得到一个特定URL模式和安装点。当这个安装点被调用时,将控制传递给这个类,这可以完全访问 Neo4j图形数据库,返回期望的任意格式的数据。尽管仍然需要通过HTTP协议,数据格式并不局限于JSON和HTML,就像使用REST API和服务器插件一样。

    Neo4j_嵌入模式&服务器模式_第10张图片
    除提供另一个改进服务器性能的机制以外,非托管扩展还提供了另一个好处,允许定义一个域特定的REST API以及一个使用任何数据交换格式的能力,这些格式包括JSON、二进制、文本或者你选定的其他格式。

    ⑤流REST API
    有效载荷比较小是因为流的结果在送回时压缩了(空白的地方删除了)。流也能减少服务器执行这一工作需求的内存量。因为请求的数据在从数据库读出的时候直接流回了客户端,在这个过程中没有经过临时存储任何节点或关系对像。

  9. 总结
    嵌入式模式,仅仅是对Java和其他几种基于JVM的语言是可以的。能够直接对所有的Neo4j低层API进行访问并且能够增强与这一模式相关获得的性能,但也要与Neo4j 共享资源(内存等)。这可能潜在的在应用程序的管理中引进一些额外的开销和并发症。
    服务器模式中,Neo4j的流程是隔离的,并且能够与你的应用程序彻底的分离进行管理。然而,所有的交互是通过REST提取层实现的,会对性能产生一些影响,也需要对其进行理解并进行适当的处理。
    这些性能问题并不是不能解决的,具有像服务器插件的选项、扩展、流和适当的使用Cypher声明,都能够帮助服务器模式以更好的性能运行。

你可能感兴趣的:(Neo4j)