我在Google Kubernetes Engine中运行着.Net服务器。它配置为通过Google Cloud Endpoints使用gRPC。现在,我需要安排任务每天调用一次我的gRPC方法。
我尝试的第一件事是使用Google Cloud Scheduler直接调用http方法。为此,我有:
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方法的任务的最佳方法是什么:
答案 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命名服务的功能 正在运行的服务向其注册的位置以及命名服务的位置 众所周知。我们决定在决定具体事项之前收集反馈 服务发现实施。因此,您的意见非常欢迎!