单个Java应用程序实例中的多个Gremlin集群

单个Java应用程序实例中的多个Gremlin集群,gremlin,gremlin-server,azure-cosmosdb-gremlinapi,Gremlin,Gremlin Server,Azure Cosmosdb Gremlinapi,在一个场景中,一个java应用程序实例可以与多个Gremlin服务器通信(比如CosmosDB中的多个图形实例)。在这种情况下,创建和缓存Gremlin客户端的建议是什么。看起来在我的mac上,我可以创建的群集实例的最大数量少于300个。除此之外,我得到了“打开的文件太多异常” 您应该为应用程序的生命周期创建一个集群对象。假设您使用的是无会话请求,那么您也将仅从该集群创建一个客户机实例并重新使用它。当然,在某些情况下,单个集群对象可能是不够的。有一些驱动程序配置选项只能应用于集群对象,而不能应用

在一个场景中,一个java应用程序实例可以与多个Gremlin服务器通信(比如CosmosDB中的多个图形实例)。在这种情况下,创建和缓存Gremlin客户端的建议是什么。看起来在我的mac上,我可以创建的群集实例的最大数量少于300个。除此之外,我得到了“打开的文件太多异常”


您应该为应用程序的生命周期创建一个
集群
对象。假设您使用的是无会话请求,那么您也将仅从该
集群创建一个
客户机
实例并重新使用它。当然,在某些情况下,单个
集群
对象可能是不够的。有一些驱动程序配置选项只能应用于
集群
对象,而不能应用于它产生的
客户端
实例。例如,如果您有多个身份验证方法或连接到不同的服务器,则这些设置将绑定到
集群
,这将要求您拥有多个这样的对象


虽然您总是希望在管理驱动程序的设置时小心谨慎,但打开大量具有默认设置的
集群
对象(这是大多数人的起点)可能会触发由以下原因引起的
错误:java.io.IOException:您看到的打开文件过多
。每个
集群
对象将打开许多网络资源,除非您在操作系统中更改了默认设置,否则可能会超出文件限制。此消息是操作系统级别的问题,internet上有许多解决方法。

感谢您的回复。我了解最佳实践。但是,假设一个多租户应用程序与多个数据库通信,那么每个数据库都需要一个Gremlin客户端,不是吗?有办法绕过它吗?比如说,如果我的应用程序可以与100个数据库通信,我需要100个Gremlin客户端。理论上,我必须同意这一点。如果有100个不同的数据库,根据您所做的工作,每个数据库可能需要一个
客户机
实例。如果您不需要关闭每个租户的
客户机
,那么您可以为整个应用程序使用一个
客户机
,但不确定您的要求到底是什么。无论如何,如果你必须这样做的话,那么错误消息是你应该谷歌的东西。这更像是一个网络问题而不是修补匠的问题:再次感谢你——这很有帮助。我的要求是支持一个应用程序以最有效的方式与多个图形数据库进行对话。我确实计划保留为每个租户创建的客户端缓存,并在不活动时逐出并关闭它们。我知道我会在200-300个这样的客户机上碰壁,但我想看看是否还有其他有效的方法可以尝试。我想说
集群是拆卸/拆卸成本最高的一块,所以保留其中一个是最好的
Client
更便宜,但您需要为每种类型找到合适的连接池大小。我相信是连接池大小触发了ulimit错误,因为每个连接都是一个开放的web套接字连接-如果您有不同的身份验证,那么您需要在
集群上执行每个身份验证。
caused by: java.io.IOException: Too many open files

java.lang.IllegalStateException: failed to create a child event loop

at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:88)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:58)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:47)
at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:59)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:86)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:81)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:68)
at org.apache.tinkerpop.gremlin.driver.Cluster$Factory.<init>(Cluster.java:1065)
final Cluster cluster = Cluster.build()
                .addContactPoint("host")
                .port(443)
                .credentials(graphUserName,
                        "graph-password")
                .serializer("serializer)
                .enableSsl(true)
                .create();
        cluster.connect());