首页 > 解决方案 > 如何安全地将布尔字段添加到 gRPC 服务器结构?

问题描述

我正在寻找将本质上是“状态”布尔字段的内容添加到我的 gRPC 服务器。这个想法是当满足某些条件时可以设置服务器的状态,因此当任何新的 gRPC 请求进来时,响应将相应地进行调整。

我有一个server struct我正在使用的,对于这个例子,我添加了一个HappyHour bool字段。我有一个在服务器启动时运行的 goroutine,它每分钟检查一天中的时间。如果一天中的时间在下午 5 点到 7 点之间,则 HappyHour 设置为 true。否则,它被设置为假。

type server struct {
    HappyHour bool
    mu     sync.RWMutex
}

func (s *server) OrderDrink(ctx context.Context, req *bar.DrinkRequest) (*flatbuffers.Builder, error) {

    drink := string(req.drink())
    qty := req.qty()


    // Code here to look up the price of the drink in the database
    total := price*qty

    // Use a mutex to check HappyHour status 
    s.mu.RLock()
    defer mu.RLock()
    if s.HappyHour == true {
        total=total/2
    }

    b := flatbuffers.NewBuilder(0)
    // Serialize the response and send it to the client
}


func main() {
    lis, err := net.Listen("tcp", "0.0.0.0:50051")
    if err != nil {
        log.Fatal(err)
    }

    s := grpc.NewServer(grpc.CustomCodec(flatbuffers.FlatbuffersCodec{}))

    var srv server
    bar.RegisterBARServer(s, &srv) 

    // Monitor happy hour
    go happyHour(&srv)
}

从我最初的测试开始,一切似乎都在工作,但我对 gRPC 还是很陌生,并且有点担心在服务器结构上使用互斥锁。

如果有很多客户端连接到服务器,是否会对性能产生负面影响?如果我正在阅读或更新 HappyHour,并且已获得锁,这会影响新用户连接或发送请求吗?或者这只会影响实际HappyHour领域?

标签: gogrpc

解决方案


推荐阅读