账单-雪花主键-无锁化唯一主键插入

This commit is contained in:
2025-09-09 15:54:05 +08:00
parent 7f54afc166
commit d2f00bb7f8
7 changed files with 109 additions and 68 deletions

View File

@@ -91,29 +91,13 @@ public class BillMessageService implements InitializingBean {
}
}
public void handleBillMessage(List<BillMessage> billMessageList) {
List<Long> uidList = billMessageList.stream().map(BillMessage::getUid).distinct().toList();
Map<Long, Users> usersMap = usersService.getUsersMapByUids(uidList);
public void handleBillMessageV2(BillMessage billMessage) {
List<BillRecord> poList = billMessageList.stream().map(billMessage -> {
BillRecord billRecord = new BillRecord();
BeanUtils.copyProperties(billMessage, billRecord);
Users u = usersMap.get(billMessage.getUid());
if (null != u){
billRecord.setPartitionId(u.getPartitionId());
}
BillRecord billRecord = insertBillRecordIgnore(billMessage);
log.info("【处理账单mq】 billRecord 插入成功 id:{} messId: {} mess:{}",
billRecord.getBillId(), billMessage.getMessId(), JSON.toJSONString(billMessage));
if (null == billRecord.getBillId()){
billRecord.setBillId(DefaultIdentifierGenerator.getInstance().nextId(null));
}
return billRecord;
}).toList();
billRecordMapper.insertIgnore(poList);
String[] messIdList = billMessageList.stream().map(BillMessage::getMessId).toArray(String[]::new);
recordMessMap.fastRemove(messIdList);
recordMessMap.fastRemove(billMessage.getMessId());
}
private BillRecord insertBillRecord(BillMessage billMessage) {
@@ -139,6 +123,37 @@ public class BillMessageService implements InitializingBean {
throw new ServiceException(BusiStatus.SERVERBUSY);
}
private BillRecord insertBillRecordIgnore(BillMessage billMessage) {
long startTime = System.currentTimeMillis();
long copyPropertiesTime = 0;
long getUserTime = 0;
long insertTime = 0;
BillRecord billRecord = new BillRecord();
BeanUtils.copyProperties(billMessage, billRecord);
copyPropertiesTime = System.currentTimeMillis();
Users u = usersService.getUsersByUid(billMessage.getUid());
getUserTime = System.currentTimeMillis();
if (null != u){
billRecord.setPartitionId(u.getPartitionId());
}
int insertRow = billRecordMapper.insertIgnore(billRecord);
insertTime = System.currentTimeMillis();
long endTime = System.currentTimeMillis();
log.info("insertBillRecordIgnore row {} performance - copy: {}ms, getUser: {}ms, insert: {}ms, total: {}ms",
insertRow,
copyPropertiesTime - startTime,
getUserTime - copyPropertiesTime,
insertTime - getUserTime,
endTime - startTime);
return billRecord;
}
@Override
public void afterPropertiesSet() throws Exception {
recordMessMap = redissonClient.getMap(RedisKey.bill_record_message.getKey());

View File

@@ -29,7 +29,7 @@ public class RocketMQService {
* 送消息发送到MQ
*/
public void sendBillRecordMessage(BillMessage billMessage) {
mqMessageProducer.send(MqConstant.BILL_RECORD_TOPIC, billMessage,
mqMessageProducer.send(MqConstant.BILL_RECORD_V2_TOPIC, billMessage,
sendResult -> log.info("sendBillRecordMessage success message: {} queue {}", JSON.toJSONString(billMessage), sendResult.getMessageQueue().getQueueId()),
throwable -> log.error("sendBillRecordMessage fail message: {}", JSON.toJSONString(billMessage), throwable));
}