feat: batch kafka message persistence

This commit is contained in:
richjohnrambo
2026-09-24 22:45:07 +08:00
parent 7f2df1dd4f
commit f898a7171c
18 changed files with 682 additions and 98 deletions
+76
View File
@@ -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)
}