feat: batch kafka message persistence
This commit is contained in:
@@ -3677,6 +3677,82 @@ func PersistPreparedMessage(tenantID types.TenantID, msg *types.Message, attachm
|
||||
return Messages.PersistPrepared(tenantID, msg, attachmentURLs, readBySender)
|
||||
}
|
||||
|
||||
type PreparedMessageBatchItem struct {
|
||||
Message *types.Message
|
||||
ReadBySender bool
|
||||
}
|
||||
|
||||
func PersistPreparedMessageBatch(tenantID types.TenantID, items []PreparedMessageBatchItem) error {
|
||||
if len(items) == 0 {
|
||||
return nil
|
||||
}
|
||||
tenantAdp, err := tenantBusinessAdapter(tenantID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
batchAdp, ok := tenantAdp.(adapter.TenantMessageBatchAdapter)
|
||||
if !ok {
|
||||
return types.ErrUnsupported
|
||||
}
|
||||
if items[0].Message == nil {
|
||||
return types.ErrMalformed
|
||||
}
|
||||
isGroup := types.GetTopicCat(items[0].Message.Topic) == types.TopicCatGrp
|
||||
month := items[0].Message.ShardMonth
|
||||
stored := make([]*types.Message, 0, len(items))
|
||||
for _, item := range items {
|
||||
msg := item.Message
|
||||
if msg == nil || msg.TenantID != tenantID || msg.Topic == "" || msg.SeqId <= 0 || msg.Uid().IsZero() ||
|
||||
(types.GetTopicCat(msg.Topic) == types.TopicCatGrp) != isGroup || (isGroup && msg.ShardMonth != month) {
|
||||
return types.ErrMalformed
|
||||
}
|
||||
clientMsgID, normalizeErr := normalizeClientMsgID(msg.Head)
|
||||
if normalizeErr != nil {
|
||||
return normalizeErr
|
||||
}
|
||||
msg.ClientMsgID = clientMsgID
|
||||
storedMsg, encryptErr := encryptMessageContent(msg)
|
||||
if encryptErr != nil {
|
||||
return encryptErr
|
||||
}
|
||||
stored = append(stored, storedMsg)
|
||||
}
|
||||
if isGroup {
|
||||
err = batchAdp.TenantGroupMessageSaveBatch(tenantID, stored)
|
||||
} else {
|
||||
err = batchAdp.TenantMessageSaveBatch(tenantID, stored)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, item := range items {
|
||||
msg := item.Message
|
||||
from := types.ParseUid(msg.From)
|
||||
if err = tenantAdp.TenantTopicUpdateOnMessage(tenantID, msg.Topic, msg); err != nil {
|
||||
return err
|
||||
}
|
||||
invalidateTopicCache(tenantID, msg.Topic)
|
||||
if isGroup && groupMsgRuntime != nil {
|
||||
if msg.ClientMsgID != "" {
|
||||
_ = groupMsgRuntime.MarkDone(tenantID, msg.Topic, from, msg.ClientMsgID, msg.SeqId, msg.Uid().String())
|
||||
}
|
||||
_ = groupMsgRuntime.PutShardRoute(tenantID, msg.Topic, GroupMessageShardRoute{
|
||||
Month: msg.ShardMonth, MinSeq: msg.SeqId, MaxSeq: msg.SeqId, Count: 1,
|
||||
})
|
||||
_ = groupMsgRuntime.CacheHotMessage(tenantID, msg)
|
||||
}
|
||||
if item.ReadBySender && !from.IsZero() {
|
||||
if updateErr := tenantAdp.TenantSubsUpdate(tenantID, msg.Topic, from, map[string]any{
|
||||
"RecvSeqId": msg.SeqId, "ReadSeqId": msg.SeqId,
|
||||
}); updateErr == nil {
|
||||
invalidateSubscriptionCache(tenantID, msg.Topic, from)
|
||||
DeleteCachedUserUnreadCount(tenantID, from)
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func NormalizeClientMsgID(head types.KVMap) (string, error) {
|
||||
return normalizeClientMsgID(head)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user