如何安排任务调用gRPC方法?

时间:2019-06-21 15:01:46

标签: google-cloud-platform google-kubernetes-engine google-cloud-endpoints grpc google-cloud-pubsub

我在Google Kubernetes Engine中运行着.Net服务器。它配置为通过Google Cloud Endpoints使用gRPC。现在,我需要安排任务每天调用一次我的gRPC方法。


我尝试的第一件事是使用Google Cloud Scheduler直接调用http方法。为此,我有:

  • 在服务器上设置HTTP到gRPC的代码转换,以通过http调用我的gRPC方法。
  • 按照here所述创建并启用SSL证书。
  • 使用服务帐户令牌创建者和服务帐户用户权限在IAM和管理控制台中创建服务帐户。
  • 使用我的url和Auth标头作为OIDC令牌创建了Cloud Scheduler作业,并在服务帐户上方创建了
  • 已部署的Google Cloud Endpoints配置具有以下参数(不仅限于它们):
    authentication:
      providers:
      - id: google_service_account
        issuer: MY_SERVICE_ACCOUNT_EMAIL
        jwks_uri: https://www.googleapis.com/robot/v1/metadata/x509/MY_SERVICE_ACCOUNT_EMAIL
      rules:
      - selector: "*"
        requirements:
          - provider_id: google_service_account
    

之后,当我运行调度程序作业时,它将返回结果“失败”。在日志中,它会以错误状态UNKNOWN写入错误。


我尝试的第二件事是使用Google Cloud Scheduler在服务器作为订阅者的情况下在Pub Sub主题中发布消息。 也无法成功,因为我无法验证Google Cloud Endpoints域的所有权。我在这里询问有关问题:How to verify ownership of Google Cloud Endpoints service URL?


现在的问题:在以下环境下,计划调用gRPC方法的任务的最佳方法是什么:

  1. 在GKE上运行的.Net服务器
  2. gRPC
  3. 该任务的自动定期调用(我可以手动调用,但这没有意义)

2 个答案:

答案 0 :(得分:0)

因此您可以手动进行HTTP调用,但不能通过Google Cloud Scheduler自动进行HTTP调用,对吗?

如果是这样,请检查请求是否到达云控制台“端点日志”中的“ Cloud Endpoint Proxy”,它可能会给您一些提示。

答案 1 :(得分:0)

分布式调度程序 更多详细信息,请参见源代码Distributed scheduler

此应用程序可以在不同的主机上运行,​​并提供以下功能: 计划在特定时间或定期执行任意命令。 与应用程序进行通信的方式有两种:gRPC和REST。远程 接口是 在dsched.proto文件中指定 相应的REST API也可以以API的形式在那找到 注释。我们还提供生成的Swagger文件。 为了指定任务执行的时间,我们使用cron采用的符号。 计划的任务存储在文件中,并在启动期间自动加载。

建筑物

Install gRPC
Install gRPC gateway

要解析crontab语句并安排任务执行,我们使用gopkg.in/robfig/cron.v2库。 因此,它也应该安装:go get -u gopkg.in/robfig/cron.v2.文档可以在这里找到

获取dsched软件包:获取

-u gitlab.com/andreynech/dsched

现在可以在dscheduler中运行标准的go build命令,并且 网关目录以生成调度程序和REST/JSON API的二进制文件 网关。检查我们的 查看CI配置文件 设置建筑环境。

跑步 所有调度功能均由dscheduler可执行文件实现。所以 它可以在系统启动时或按需运行。如dscheduler --help所述, 有两个命令行参数:

-i string - File name to store task list (default "/var/run/dscheduler.db")
-p string - Endpoint to listen (default ":50051")

如果需要提供REST/JSON API,则位于 网关目录应运行。它可以与 dscheduler,但通常是其他主机,可以通过 HTTP从外部以相同的方式可以与在其中运行的dscheduler进行通信 内部网络。此设置也是拆分调度程序和 两个可执行文件中的网关。网关主要是生成的应用程序, 支持通过运行网关--help描述的几个command-line参数。 重要参数是-sched_endpoint字符串,它是Scheduler的终结点 服务(默认为“ localhost:50051”)。它指定主机名和端口 dscheduler在哪里侦听请求。

计划任务(测试) 有三种控制调度程序服务器的方法:

使用在cli/目录中实现的Go客户端 使用在py_cli目录中实现的Python客户端 使用REST/JSON API网关和curl

Go和Python客户端具有相似的命令行参数集。

$ ./cli --help

cli的用法:

 -a string
        The command to execute at time specified by -c parameter
  -c string
        Statement in crontab format describes when to execute the command
  -e string
        Host:port to connect (default "localhost:50051")
  -l    List scheduled tasks
  -p    Purge all scheduled tasks
  -r int
        Remove the task with specified id from schedule
  -s    Schedule task. -c and -a arguments are required in this case
They are using gRPC protocol to talk to scheduler server. Here are several
example invocations:

$ ./cli -l list currently scheduled tasks

$ ./cli -s -c "@every 0h00m10s" -a "df" schedule df command for
execution every 10 seconds

$ ./cli -s -c "0 30 * * * *" -a "ls -l" schedule ls -l command to
run every 30 minutes

$ ./cli -r 3 remove task with ID 3

$ ./cli -p remove all scheduled tasks

也可以使用curl来调用dscheduler功能 REST/JSON API网关。假设dscheduler和网关应用程序 正在运行,这是一些调用以列出,添加和删除调度 来自同一主机(本地主机)的条目:

curl 'http://localhost:8080/v1/scheduler/list' list currently scheduled tasks

curl -d '{"id":0, "cron":"@every 0h00m10s", "action":"ls"}' -X POST 'http://localhost:8080/v1/scheduler/add' schedule ls command for execution every 10 seconds

curl -d '{"id":0, "cron":"0 30 * * * *", "action":"ls -l"}' -X POST 'http://localhost:8080/v1/scheduler/add' schedule ls -l to run every 30 minutes

curl -d '{"id":2}' -X POST 'http://localhost:8080/v1/scheduler/remove' remove task with ID 2.

curl -X POST 'http://localhost:8080/v1/scheduler/removeall' remove all scheduled tasks

所有更改都会自动保存在文件中。

关于调度程序服务发现的想法 在大型部署方案(例如数百台主机)中,可能是 找出所有调度程序所在的IP地址和端口的难题 服务已启动。添加对Zeroconf的支持将非常容易 (Bonjour / Avahi)技术可简化服务发现。作为替代,它 可能可以实现类似于CORBA命名服务的功能 正在运行的服务向其注册的位置以及命名服务的位置 众所周知。我们决定在决定具体事项之前收集反馈 服务发现实施。因此,您的意见非常欢迎!