定時任務報警通知解決方案詳解
作者: 唐濤、黃曉萌
什麼是定時任務
定時任務是每個業務常見的需求,比如每分鐘掃描超時支付的訂單,每小時清理一次資料庫歷史資料,每天統計前一天的資料並生成報表等等。
隨著微服務和雲端計算的興起,定時任務技術也是發展迅速,不僅能做單機的定時任務,而且在分散式系統下應用也很廣泛,成為了業務做兜底、資料處理的第一選擇。
定時任務為什麼需要通知
定時任務現在在業務資料處理中的比重越來越重,如果業務資料處理失敗了,需要及時通知到業務方,確保了服務的可靠性和穩定性。同時,好的定時任務通知系統,還能分析任務失敗的原因(比如堆疊資訊)並通知給業務方,幫助使用者快速定位問題。
根據通知的型別,大概可以有以下幾類:
- 成功通知:任務執行成功,把結果通知給使用者。比如統計前一天的資料並把 GaaP 結果通過簡訊等渠道傳送給對應負責人。
- 超時通知:任務執行超時,通知使用者。
- 失敗通知:任務執行失敗,通知使用者。
- 機器異常通知:執行的機器下線或者繁忙,通知使用者。
自研定時任務報警通知
如果是自研的定時任務系統,或者使用了開源定時任務框架(比如 Quartz),想要增加報警通知能力,我們可以採取什麼方案呢?從實時性角度來看,簡訊和電話通知實時性最高,但是這兩種方案需要比較大的成本,比如簡訊通知需要簡訊平臺。如果沒有簡訊平臺,我們也可以採用郵件和 webhook 通知。
郵件
每個郵件伺服器都由 SMTP 伺服器和 POP3 伺服器構成,其中 SMTP 伺服器負責發郵件的請求,而 POP3 負責收郵件的請求。通過 SMTP 與 POP3 即可實現郵件的收發。
郵件傳送原理圖
- 配置郵件伺服器
以網易 163 郵件為例,在傳送方郵箱設定裡,開啟 POP3/SMTP 服務
- 以 Java 程式碼為例,傳送郵件的 demo
``` import org.junit.Test; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Properties;
public class SendMailDemo { public static void main(String[] args) throws Exception { Properties prop = new Properties(); prop.setProperty("mail.host","smtp.163.com");//設定傳送方郵箱伺服器 prop.setProperty("mail.transport.protocol","smtp");//郵件傳送協議 prop.setProperty("mail.smtp.auth","true");//需要驗證使用者名稱密碼 Session session = Session.getDefaultInstance(prop); Transport ts = session.getTransport(); String mailUser = "[email protected]"; //郵箱的賬號 String mailPasswd = "123456789"; //郵箱的密碼 ts.connect("smtp.163.com", mailUser, mailPasswd); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(mailUser)); //收件人的郵箱地址 message.setRecipient(Message.RecipientType.TO,new InternetAddress("[email protected]")); //郵件的標題 message.setSubject("自定義通知"); message.setContent("
郵件通知傳送成功!
","text/html;charset=UTF-8"); ts.sendMessage(message,message.getAllRecipients()); ts.close(); } } ```- 執行一次,可以收到郵件
WebHook
釘釘、企業微信、飛書,支援通過 webhook 方式傳送通知到群裡。下面以釘釘 webhook 為例
- 首先在釘釘群裡,建立一個機器人
群設定->智慧群助手
新增機器人->自定義 webhook 接入
- 直接通過 http 呼叫 webhook 連結即可,以 Java 程式碼為例,demo 如下:
public class WebhookDemo {
public static void main(String[] args) throws Exception {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost("http://oapi.dingtalk.com/robot/send?access_token=fcf4c30596a8b26d76a6d4dcd658b708066e23e877b285c784db2360660c97e0");
httpPost.setHeader("Content-Type", "application/json;charset=utf8");
JSONObject result = new JSONObject();
JSONObject text = new JSONObject();
text.put("content", "測試釘釘傳送定時任務通知");
result.put("text", text);
result.put("msgtype", "text");
String jsonString = JSON.toJSONString(result);
StringEntity entity = new StringEntity(jsonString, "UTF-8");
httpPost.setEntity(entity);
CloseableHttpResponse response = null;
response = httpClient.execute(httpPost);
HttpEntity responseEntity = response.getEntity();
System.out.println("響應結果:" + EntityUtils.toString(responseEntity));
}
}
- 執行一次,可以在釘釘群裡看到通知訊息
開源任務排程系統的通知解決方案
ElasticJob通知解決方案
ElasticJob 是一款基於 Quartz 開發,依賴 Zookeeper 作為註冊中心、輕量級、無中心化的分散式任務排程框架,目前已經通過 Apache 開源,使用 ElasticJob 可以快速實現分散式任務排程。ElasticJob 只需配置定時任務的錯誤處理策略即可實現通知功能。目前 ElasticJob 支援郵件、釘釘、微信三種通知渠道。
- 接入步驟
以釘釘通知為例
- 引入 pom
```
- 新增 Job
@Component
public class ErrorNoticeDingtalkJob implements SimpleJob {
@Override
public void execute(final ShardingContext shardingContext) {
throw new RuntimeException(String.format("An exception has occurred in Job, The parameter is %s", shardingContext.getShardingParameter()));
}
}
- 對定時任務進行配置
jobs:
errorNoticeDingtalkJob:
elasticJobClass: com.springboottemplate.elasticjob.job.ErrorNoticeDingtalkJob
overwrite: true
shardingTotalCount: 3
shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou
jobErrorHandlerType: DINGTALK
jobBootstrapBeanName: errorNoticeDingtalkBean
props:
dingtalk:
webhook: you_webhook
keyword: you_keyword
secret: you_secret
connectTimeout: 3000
readTimeout: 5000
- 通知功能缺點
ElasticJob 沒有提供控制檯來配置定時任務的通知,需要在配置檔案裡針對每個任務單獨配置,配置成本比較高。而且想要修改定時任務的通知配置,還需要修改配置重啟服務才能生效,可維護性低。
XXL-JOB 通知解決方案
XXL-JOB,這是出自大眾的開源專案,官網上介紹這是一個輕量級分散式任務排程框架,其核心設計目標是開發迅速、學習簡單、輕量級、易擴充套件,與 SpringBoot 有非常好的整合,而且監控介面就整合在排程中心,介面又簡潔,對於企業維護起來成本不高,預設支援失敗的郵件告警。這就使很多企業選擇 XXL-JOB 做排程平臺。
- 接入步驟
XXL-JOB 預設支援失敗的郵件告警,只需要在控制檯配置對應郵箱即可。
郵件通知也進行了排版:
- 其他通知渠道
XXL-JOB 可以擴充套件簡訊、釘釘等方式,但是需要開發者自己手動實現。如果需要新增一種告警方式,需要新增一個通知類實現 “com.xxl.job.admin.core.alarm.JobAlarm” 介面即可
- 對比 ElasticJob
XXL-JOB 可以通過控制檯來配置每個任務的通知配置,動態生效,接入成本低,可維護性高,比 ElasticJob 方便很多。但是當前版本控制檯只支援郵件通知,郵件通知響應速度比較慢,不適合用在核心線上業務的失敗通知。
SchedulerX 企業級通知解決方案
SchedulerX 簡介
阿里雲任務排程 SchedulerX 是阿里巴巴自研的基於 Akka 架構的一站式任務排程平臺,相容開源 XXL-JOB、ElasticJob、Quartz(規劃中),提供了商業級的通知管理服務。
通知功能的優勢
相對於 ElasticJob、XXL-JOB 等分散式任務排程框架的通知功能相比,SchedulerX 通知功能具有以下幾大優勢:
- 多元化的通知通道
當前支援簡訊、電話、郵箱、webhook(釘釘、企業微信、飛書)。
-
豐富的通知型別
-
- 任務執行失敗通知
- 任務執行超時通知
- 無可用機器通知
- 機器繁忙通知
- 任務執行結果通知
-
快速響應
通知內容更全面、更智慧的通知管理能力,使通知的響應變得更迅速,提高問題解決的速度,減少因業務異常造成的損失。以失敗通知為例,通知內容不僅記錄了任務的基本資訊,還記錄了失敗原因,方便運維人員快速定位問題。
- 強大的通知查詢功能
SchedulerX 支援查詢 15 天內通知歷史記錄,根據應用、任務、通知型別、通知渠道等多個條件查詢的通知資訊,能為任務的日常的維護提供參考與指導作用。
- 支援多種通知物件
SchedulerX 通知管理目前支援通知聯絡人與通知聯絡人組兩種通知物件。SchedulerX 對通知聯絡人進行統一管理,使用者可以根據自身需要靈活的配置任務的通知物件,減少了通知物件配置的複雜度。
- 配置簡單、學習成本低
SchedulerX 無需使用者新增任何程式碼,在控制檯上即可完成所有的報警通知配置,上手速度快、難度低、學習成本幾乎為零。
- 低成本與免運維
SchedulerX 通知管理功能不收取任何費用。其更智慧、更全面的通知管理能力可以有效降低系統的運維成本和運維人員的時間成本。
通知功能核心流程
定時任務在某種狀態下會觸發通知,通過接入層的統一 Api 將通知資訊傳送給 SchedulerX 的通知管理平臺。通知管理平臺對通知進行接收、儲存。再基於任務的通知配置規則以郵件、簡訊、語音等方式將定時任務通知推送給使用者。
配置聯絡人組
目前 SchedulerX 的定時任務預設使用的是應用的通知渠道與聯絡人。想要配置任務的通知渠道與聯絡人只需要配置對應應用的通知渠道以及通知聯絡人即可。
- 新增聯絡人
登入 SchedulerX 控制檯>通知管理>通知聯絡人。在聯絡人頁籤,單擊新建聯絡人,填寫聯絡人相關資訊即可。
- 新增聯絡人組
登入 SchedulerX 控制檯>通知管理>通知聯絡人。在聯絡人組頁籤,單擊新建聯絡組,填寫組名稱,繫結聯絡人即可。
- 應用繫結聯絡人組
登入 SchedulerX 控制檯>應用管理。找到對應的應用,在通知配置中繫結對應的通知聯絡人組即可。
配置通知型別
登入 SchedulerX 控制檯>任務管理。新增或者編輯任務時候,在通知配置中選擇對應的通知型別即可。
通知記錄查詢
SchedulerX 支援查詢 15 天內通知記錄,根據記錄的任務報警資訊與通知資訊,開發者可以瞭解到任務一段時間內的健康狀態,能為任務的日常的維護提供參考與指導作用。
與開源方案的對比
- 談談我工作中的23個設計模式
- 雲邊協同下的統一應用管理:基於 OpenYurt 和 KubeVela 的解決方案
- OpenKruise v1.3:新增自定義 Pod Probe 探針能力與大規模叢集效能顯著提升
- Koordinator v0.7: 為任務排程領域注入新活力
- 傳統大型國企雲原生轉型,如何解決彈性、運維和團隊協同等問題
- Dubbo 3 易用性升級之 Dubbo 官網大改版
- 阿里雲容器服務 ACK 產品技術動態(202208)
- RocketMQ Streams在雲安全及 IoT 場景下的大規模最佳實踐
- RocketMQ 5.0:無狀態代理模式的探索與實踐
- Apache RocketMQ 5.0 在Stream場景的儲存增強
- 快手 RocketMQ 高效能實踐
- RocketMQ DLedger架構在小米的大規模實踐
- 定時任務報警通知解決方案詳解
- Dubbo Mesh 總體技術架構方案
- 說說 Spring 定時任務如何大規模企業級運用
- 龍湖千丁基於 [email protected] 的雲原生智慧停車系統架構實踐
- 基於 RocketMQ 的 MQTT 服務架構在小米的實踐
- 開發者測評:相比 Harbor,我選擇 ACR 的三點原因
- 5 分鐘完成 ZooKeeper 資料遷移
- Fluid 助力阿里雲 Serverless 容器極致提速