refactoring

This commit is contained in:
Chris Lu
2018-12-07 01:25:01 -08:00
parent 6946c51430
commit 29f1673d97
3 changed files with 46 additions and 62 deletions

View File

@@ -1,12 +1,20 @@
package util
import (
"fmt"
"sync"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/keepalive"
)
var (
// cache grpc connections
grpcClients = make(map[string]*grpc.ClientConn)
grpcClientsLock sync.Mutex
)
func NewGrpcServer() *grpc.Server {
return grpc.NewServer(grpc.KeepaliveParams(keepalive.ServerParameters{
Time: 10 * time.Second, // wait time before ping if no activity
@@ -26,3 +34,32 @@ func GrpcDial(address string, opts ...grpc.DialOption) (*grpc.ClientConn, error)
return grpc.Dial(address, opts...)
}
func WithCachedGrpcClient(fn func(*grpc.ClientConn) error, address string, opts ...grpc.DialOption) error {
grpcClientsLock.Lock()
existingConnection, found := grpcClients[address]
if found {
grpcClientsLock.Unlock()
return fn(existingConnection)
}
grpcConnection, err := GrpcDial(address, opts...)
if err != nil {
grpcClientsLock.Unlock()
return fmt.Errorf("fail to dial %s: %v", address, err)
}
grpcClients[address] = grpcConnection
grpcClientsLock.Unlock()
err = fn(grpcConnection)
if err != nil {
grpcClientsLock.Lock()
delete(grpcClients, address)
grpcClientsLock.Unlock()
}
return err
}