2016-05-01 66 views
-1

假設有一個有些系統中數據庫中的行有事時都充滿:應該使用哪種模式或技術來生成事件報告?

  • 時用戶只需登錄,插入某一行與表user_logins登錄和時間類型的數據庫。
  • 時操作使用戶一個電話,與運營商ID,用戶ID和日期的行表數據庫insertted outgoing_calls
  • 當操作員沒有應答用戶的呼叫,與日期一排,用戶ID和類型插入到數據庫中的呼叫

然後經過一段時間後,比如說月,我們需要一個關於誰呼叫誰,多少個呼叫未被應答等的報告等等。應該使用什麼模式來組織這個功能?

乍一看這個過程看起來像記錄了很多,但是當我們用某種格式(date-processId-messageWithPlaceHolders)存儲消息時,日誌記錄是一個過程。因此使用這種測井系統不太合適。

從另一個角度來看,它看起來像事件處理,但當「事件」發生時沒有必要做任何動作,沒有聽衆,也沒有隊列。只需將其存儲到數據庫以進一步報告

那麼應該使用哪種模式或技術來有效地實現此功能?

回答

1

您的要求是每月生成一個who-called-who報告,以便您可以瞭解您的電話的成功(或者您有任何理由)。

您不需要考慮與記錄或事件處理或任何事物的相似性。只是分析從上往下的問題,讓你需要完成任務的工作最少的:

  • 你需要生成一個報告每月
  • 爲此,你需要運行至少產生結果的工作每月一次
  • 爲此,您需要以您的工作可以理解的格式存儲您的活動。

所以一個好的解決方案是每月運行一個批處理作業。這可以是手動運行的java進程,cron作業,hadoop任務......取決於您的技術堆棧。你的事件需要在他們發生的時候被存儲。同樣,取決於您的堆棧,它可以是關係數據庫,關鍵值存儲區,具有日誌行的文件,無論在您的技術堆棧中最容易使用什麼。

所有這些選項都可以是好的,但有些可能會更好。例如,我建議不要使用純字符串日誌記錄。您需要提取像時間,數字等結構化屬性,所以更喜歡一種可以幫助您保持類型安全的格式。

0

我會用剛剛實行,它 - 在你的業務服務模式:

void login(User user) { 
    entityManager.persist(new UserLogin(user)); 
} 

void call(Operator op, User user) { 
    entityManager.persist(new PhoneCall(op, user)); 
} 

void missedCall(User user, Operator op) { 
    entityManager.persist(new MissedCall(user, op)); 
} 

這是假設您的企業服務,如果呼叫被錯過的通知。如果僅僅是沒有答案的應該觸發數據庫更新,我會轉身的邏輯,並記錄成功答案,而不是:

void answeredCall(UserCall call, Operator op) { 
    entityManager.merge(call).setAnsweredBy(op); 
} 

,並報告調用其中call.answeredBy is null

無論哪種情況,我都會通過查詢數據庫來完成報告。

替代

如果需要如此記錄在您的業務服務的大多數操作,我可能會使用AOP攔截器自動執行此。

相關問題