这是我参与「第三届青训营-后端场」笔记创作活动的的第2篇笔记
go-micro
在做抖音项目的过程中,按照给的文档参数,需要对传入的视频流数据先在网关进行读取,读取之后再通过grpc调用服务上传视频。但是在通过grpc调微服务的时候,会直接返回一个null,不会真正的调用成功服务。经过一段时间的排查,发现是上传视频过大,调用微服务失败了。
解决方案
第一种解决方案是在阅读go-micro给的文档后得出,可以通过stream多次传输数据,最后将多次传输数据合并之后再上传,但是这样需要考虑时间的问题。但在我开开心心的改代码是发现,go-micro的stream传输缺少了一个关键的方法:CloseAndRecv(),这直接导致服务在接受数据的时候不能接收完所有数据再同一做处理。
第二种方案,通过查阅资料得到gprc的参数量大小应该是4M,因此想办法改变这个参数,但网上并没有相关的资料,就连go-micro的文档也没有这个方面的,最后只能自己去源代码里面找一找,最后得到如下代码配置
服务端
reg := consul.NewRegistry(func(options *registry.Options) {
options.Addrs = []string{"127.0.0.1:8500"}
})
service := micro.NewService(
micro.Name("go.micro.service.VideoService"),
micro.Version("latest"),
micro.Registry(reg),
)
// Initialise service
service.Server().Init(grpc.MaxMsgSize(1024 * 1024 * 1024))
客户端
microService.Client().Init(grpc.MaxSendMsgSize(1024 * 1024 * 1024))
不过这里客户端不需要配置也可以
go-redis
在go语言下面连接reids的包一般是go-redis和redisgo两个,但是其中redisgo不支持redis的cluster模式和哨兵模式连接,因此选择go-redis包,在通过go-redis包连接的时候会出现i/o time out错误,字面意义上看是因为超时了,可能是因为go-redis连接的问题,但是这个错误是薛定谔的错误,无法稳定复现,不知道是go-redis包的问题还是说redis服务器的问题,但是在代码中加入如下配置时此错误没有再次出现
edisDB = redis.NewClusterClient(&redis.ClusterOptions{
Addrs: utils.RedisAddr,
MinIdleConns: 10,
ReadTimeout: time.Minute,
WriteTimeout: time.Minute,
// To route commands by latency or randomly, enable one of the following.
//RouteByLatency: true,
RouteRandomly: true,
})