簡體   English   中英

使用Kafka流的事件數據聚合

[英]Event Data Aggregation Using Kafka Streaming

public class UserEvent {
    int userId;
    long loginTime;
    long jobId;
    long jobAttachTime;
    long jobdetachTime;
    long workTime;
    long logoutTime;
    long activeTime;
    EventType eventType;
}

我有一個應用程序,其中基於登錄,作業附加,作業分離和注銷等用戶操作,在Kafka主題上發送事件。 每個事件在UserEvent對象中都有一些信息以及userIdeventType ,例如, 登錄事件具有loginTime 作業附加事件的屬性為jobIdjobAttachTime 同樣, 注銷事件具有屬性logoutTime 我的要求是在收到每個用戶的注銷事件后,將所有這些事件中的信息聚合到一個對象中。 這樣,在注銷事件之后, UserEvent對象將具有loginTimelogoutTime ,計算出的workTimeactiveTime等。如何使用Kafka KStreams和/或KTables實現此目的

為了聚合UserEvents,您需要一個鍵(示例:會話ID)來過濾所有事件中共有的會話。 假設您為每個用戶事件附加了sessionID,該ID對於每個會話都是唯一的,但對於在該會話期間發生的所有用戶事件而言,都是相同的。

可以通過以下方式使用GroupBy().aggregate()來實現:( 考慮到您具有與會話ID等效的屬性,該屬性可以唯一地用作鍵

    // Let's say there is a  sessionID
KTable<String, UserEvent> userEventSummary = userEvents
                                  .groupBy(event -> event.get("sessionId"))
                                  .aggregate((userEventSummary,userEvent)->{
                                        userEventSummary = userEvent;
                                        if(new!= null){
                                            String loginEvent = new.get("eventType").get("eventName");
                                            if(loginEvent.equals("login")){
                                                userEventSummary.setLoginTime(new.getLoginTime());
                                            }
                                            if(loginEvent.equals("logOut")){
                                                long workTime = Math.abs(userEvent.getLogOutTime()-userEventSummary.getLoginTime());
                                                userEventSummary.setWorkTime(workTime);
                                                userEventSummary.setActiveTime(workTime);
                                            }
                                        }
                                        return userEventSummary;
                                   });

// if default value for logoutTime is 0, filter the user events which don't have logout time yet
KTable<String, UserEvent>  loggedOutEventSummary = userEventSummary.filter(event-> event.getLogOutTime()!= 0);

它將為具有注銷事件的用戶事件過濾的每個用戶操作返回匯總狀態。

final KStream<Integer, UserEvent> kStream = builder.stream("test-topic");
kStream.groupByKey().aggregate(() -> new UserEvent(),
                (Integer userId, UserEvent userEvent, UserEvent userEventSummary) -> {
                    if (userEvent.getEventType().equals(EventType.LOGIN)) {
                        // Event Processing logic for Login event
                    } else if (userEvent.getEventType().equals(EventType.LOGOUT)) {
                        // Event Processing logic for Logout event
                    }
                    return userEventSummary;
                });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM