go使用grpc实现异步_使用Go语言实现一个异步任务框架

推荐阅读原文获得最佳体验:使用Go语言实现一个异步任务框架 - Jiajun的编程随想

如何使用Go语言实现一个简单的异步任务框架呢?且听我一一道来。首先我们看一下常见的任务队列的架构:

4cbbffbdffd95eaa5278ef605252cc1d.png

所以作为一个任务队列,主要有这么几个部分组成:

  • Producer,负责把调用者的函数、参数等传入到broker里
  • Consumer,负责从broker里取出消息,并且消费,如果有持久化运行结果的需求,还需要进行持久化
  • 选择一个Producer和Consumer之间序列化和反序列化的协议

首先我们要定义一下Broker的接口:

type Broker interface {
        Acquire(string) *Task                                       
        Ack(*Task) bool                     
        Update(*Task)
        Enqueue(*Task) string
}

作为一个broker,获取任务,ACK,更新任务状态,入队是基本操作。然后我们要定义一个任务,既然是异步任务队列 嘛,这是自然的:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package main import ( "context" "fmt" "io" "log" "time" "github.com/golang/protobuf/ptypes/empty" "google.golang.org/grpc" pb "grpc_async_demo/protos" ) const ( address = "localhost:50051" ) func main() { conn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { log.Fatalf("failed to dial: %v", err) } defer conn.Close() client := pb.NewEchoServiceClient(conn) runBidirectionalStreaming(client) } func runBidirectionalStreaming(client pb.EchoServiceClient) { stream, err := client.BidirectionalStreaming(context.Background()) if err != nil { log.Fatalf("failed to create stream: %v", err) } done := make(chan bool) go func() { for { resp, err := stream.Recv() if err == io.EOF { // done done <- true return } if err != nil { log.Fatalf("failed to recv: %v", err) } fmt.Printf("Received response: '%s'\n", resp.Message) } }() for i := 0; i < 10; i++ { msg := fmt.Sprintf("hello async request #%d", i) if err := stream.Send(&pb.EchoRequest{Message: msg}); err != nil { log.Fatalf("failed to send: %v", err) } fmt.Printf("Sent request: '%s'\n", msg) time.Sleep(time.Second) } stream.CloseSend() <-done } func runUnaryAsync(client pb.EchoServiceClient) { for i := 0; i < 10; i++ { msg := fmt.Sprintf("hello async request #%d", i) ctx, cancel := context.WithTimeout(context.Background(), time.Second*3) defer cancel() resp, err := client.UnaryAsync(ctx, &pb.EchoRequest{Message: msg}) if err != nil { log.Fatalf("failed to unary async: %v", err) } fmt.Printf("Received response: '%s'\n", resp.Message) time.Sleep(time.Second) } } func runUnarySync(client pb.EchoServiceClient) { for i := 0; i < 10; i++ { msg := fmt.Sprintf("hello sync request #%d", i) resp, err := client.UnarySync(context.Background(), &pb.EchoRequest{Message: msg}) if err != nil { log.Fatalf("failed to unary sync: %v", err) } fmt.Printf("Received response: '%s'\n", resp.Message) time.Sleep(time.Second) } } func runVoid(client pb.EchoServiceClient) { resp, err := client.VoidMethod(context.Background(), &empty.Empty{}) if err != nil { log.Fatalf("failed to void method: %v", err) } fmt.Printf("Received response: '%s'\n", resp.Message) }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值