ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

基于 dapr cron binding 实现定时任务

2022-08-16 13:00:57  阅读:185  来源: 互联网

标签:api binding cron dapr io brands 定时


这两天在开发中的一个功能需要用到定时任务,正好最近准备更多使用 dapr,于是想到这个经常重复编写的代码看是否可以让 dapr 代劳,了解之后发现可以通过 cron binding 实现,动手之后轻松搞定,写博文记录一下(基于 kubernetes 部署环境)。

基于 dapr cron binding 实现定时任务的原理很简单,就是应用无需关心定时,只需暴露执行任务的 api 给 dapr sidecar 调用,定时交由 daprd 处理。

比如我们要实现每天早上9点进行文章导入的定时任务,首先在应用中暴露 api

[ApiController]
[ApiVersionNeutral]
public class ImportController : ControllerBase
{
    [Route("import-articles")]
    public async Task<IActionResult> Articles()
    {
        //...
    }
}

然后定义 dapr bindings.cron 组件清单

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: import-articles
  namespace: production
spec:
  type: bindings.cron
  version: v1
  metadata:
  - name: schedule
    value: '0 1 * * *'
scopes:
- brands-api
  • metadata.name 对应的是执行定时任务时所请求的应用的 api 路径
  • scopes 用于限定所针对的应用,brands-api 就是在应用的 k8s deployment 中定义的 dapr.io/app-id
  • value: '0 1 * * *' 中写的是标准的 cron 表达式,需要注意时区问题,0 1 * * * 表示北京时间每天早上9点。

如果想查看 cron binding 的调度日志,需要将 daprd 日志级别改为 debug,修改方法是在应用的 deployment 中添加 dapr.io/log-level: debug

spec:
  template:
    metadata:
      annotations:
        dapr.io/app-id: brands-api
        dapr.io/enabled: "true"
        dapr.io/log-level: debug

然后通过 kubectl logs 命令查看日志

kubectl logs --since 5m deploy/brands-api daprd

日志输出如下

time="2022-08-16T04:22:15.192224084Z" level=debug msg="name: import-articles, next run: 44.80779615s" app_id=brands-api instance=brands-api-84b4768b66-rb879 scope=dapr.contrib type=log ver=1.8.3
time="2022-08-16T04:23:00.001030337Z" level=debug msg="name: import-articles, schedule fired: 2022-08-16 04:23:00.000953098 +0000 UTC m=+50.266709169" app_id=brands-api instance=brands-api-84b4768b66-rb879 scope=dapr.contrib type=log ver=1.8.3

需要注意的地方:

  • 修改 cron 表达式后需要重新部署对应的应用才能生效
  • cron 表达式写错(写成不支持的格式)会造成 sidecar daprd 无法启动

标签:api,binding,cron,dapr,io,brands,定时
来源: https://www.cnblogs.com/dudu/p/16589165.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有