部署了三套neo4j集群,有一套上面总是出现写入超时,最长要接近一分钟,结果前端超时。
使用了几种方案尝试解决:
1、尝试减少事务数量
原实现中事务使用过多,很多不重要的查询也使用事务
把大部分的命令执行由session.WriteTransaction修改为session.Run
2、尝试创建索引
对于数据的查找,如果没有创建索引就会执行遍历,数据量大的话会比较慢(我的环境中数据量很小)
CREATE INDEX [INDEX_NAME] FOR (n:Label) ON (n.property)
3、执行命令前增加verify
这个完全没有想到,在一个环境上打开neo4j客户端log后发现执行命令前会提示已断链,估计是被老化了。
打开neo4j log的方法(go客户端):
type gdbcLogger struct {
}
func (l *gdbcLogger) Error(name string, id string, err error) {
log.Errorf("[neo4j] name[%s] id[%s] err[%s]", name, id, err)
}
func (l *gdbcLogger) Warnf(name string, id string, msg string, args ...interface{}) {
log.WithFields(log.Fields{"name": name, "id": id}).Warnf(msg, args...)
}
func (l *gdbcLogger) Infof(name string, id string, msg string, args ...interface{}) {
log.Infof("[neo4j] name[%s] id[%s]", name, id)
log.WithFields(log.Fields{"name": name, "id": id}).Infof(msg, args...)
}
func (l *gdbcLogger) Debugf(name string, id string, msg string, args ...interface{}) {
log.WithFields(log.Fields{"name": name, "id": id}).Debugf(msg, args...)
}
func gdbcConfig(conf *neo4j.Config) {
conf.Log = &gdbcLogger{}
}
func (gdbc *GraphDB) connectToGraphDB(url string, user string, passwd string) {
var err error
gdbc.Neo4jDriver, err = neo4j.NewDriver(url, neo4j.BasicAuth(user, passwd, ""), gdbcConfig)
// todo change to backoff
for err != nil {
。。。。
}
。。。。。。
}
增加verify(做了优化,如果是2s内verify过则不重新执行)(go客户端):
func (gdbc *GraphDB) verfiyNeo4jConnection() bool {
if gdbc.Status == StatusRunning {
log.Debug("Neo4j StatusRunning")
return true
}
var err error
for i := 0; i < 3; i++ {
err = gdbc.Neo4jDriver.VerifyConnectivity()
if err != nil {
log.Errorf("Neo4j driver VerifyConnectivity failed(%v)", err)
} else {
break
}
}
go func() {
<-time.After(2 * time.Second)
log.Debug("Neo4j set StatusUnkown")
gdbc.Status = StatusUnkown
}()
if err != nil {
log.Debug("Neo4j set StatusFail")
gdbc.Status = StatusFail
return false
} else {
log.Debug("Neo4j set StatusRunning")
gdbc.Status = StatusRunning
return true
}
}
在措施1、2都没生效的情况下,措施3生效了,基本不再超时了。