Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

117 строки
3.6 KiB

  1. package region_sync
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/QuantumNous/new-api/common"
  6. "github.com/QuantumNous/new-api/logger"
  7. "github.com/QuantumNous/new-api/model"
  8. "github.com/QuantumNous/new-api/setting/system_setting"
  9. "github.com/bytedance/gopkg/util/gopool"
  10. )
  11. // PushUserCreateToSlave 在 master 节点创建用户后,异步推送到 slave 节点
  12. func PushUserCreateToSlave(user *model.User) {
  13. settings := system_setting.GetRegionSyncSettings()
  14. if !settings.Enabled || !settings.IsMaster {
  15. return
  16. }
  17. if len(settings.SlaveEndpoints) == 0 || settings.SyncApiKey == "" {
  18. return
  19. }
  20. gopool.Go(func() {
  21. req := &SyncUserRequest{
  22. Username: user.Username,
  23. Email: user.Email,
  24. PasswordHash: user.Password, // 传输的是哈希值,非明文密码
  25. DisplayName: user.DisplayName,
  26. Quota: user.Quota,
  27. RemoteUserId: user.Id,
  28. Group: user.Group,
  29. AffCode: user.AffCode,
  30. }
  31. for _, endpoint := range settings.SlaveEndpoints {
  32. client := NewSyncClient(endpoint, settings.SyncApiKey)
  33. resp, err := client.SyncUserCreate(req)
  34. if err != nil {
  35. logSyncError("user", user.Username, endpoint, "", err)
  36. continue
  37. }
  38. if !resp.Success {
  39. logSyncError("user", user.Username, endpoint, resp.Error, nil)
  40. continue
  41. }
  42. logSyncSuccess("user", user.Username, user.Id, endpoint)
  43. }
  44. recordSyncLog(user.Id, 0, model.SyncTypeUserCreate, "")
  45. })
  46. }
  47. // PushQuotaUpdateToSlave 在 master 节点更新用户余额后,推送到 slave 节点
  48. func PushQuotaUpdateToSlave(userId int, quota int) {
  49. settings := system_setting.GetRegionSyncSettings()
  50. if !settings.Enabled || !settings.IsMaster {
  51. return
  52. }
  53. if len(settings.SlaveEndpoints) == 0 || settings.SyncApiKey == "" {
  54. return
  55. }
  56. logger.LogDebug(nil, "[RegionSync] PushQuotaUpdateToSlave: userId=%d, quota=%d, endpoints=%v", userId, quota, settings.SlaveEndpoints)
  57. gopool.Go(func() {
  58. for _, endpoint := range settings.SlaveEndpoints {
  59. client := NewSyncClient(endpoint, settings.SyncApiKey)
  60. resp, err := client.UpdateQuota(userId, quota)
  61. if err != nil {
  62. logSyncError("quota update", fmt.Sprintf("user %d", userId), endpoint, "", err)
  63. continue
  64. }
  65. if !resp.Success {
  66. logSyncError("quota update", fmt.Sprintf("user %d", userId), endpoint, resp.Error, nil)
  67. continue
  68. }
  69. logSyncSuccess("quota update", fmt.Sprintf("user %d", userId), 0, endpoint)
  70. }
  71. })
  72. }
  73. // logSyncError 记录同步错误日志
  74. func logSyncError(operation, target, endpoint string, errMsg string, err error) {
  75. if err != nil {
  76. common.SysError(fmt.Sprintf("[RegionSync] Failed to push %s %s to slave %s: %v", operation, target, endpoint, err))
  77. } else {
  78. common.SysError(fmt.Sprintf("[RegionSync] Slave %s rejected %s %s: %s", endpoint, operation, target, errMsg))
  79. }
  80. }
  81. // logSyncSuccess 记录同步成功日志
  82. func logSyncSuccess(operation, target string, id int, endpoint string) {
  83. if id > 0 {
  84. common.SysLog(fmt.Sprintf("[RegionSync] Successfully pushed %s %s (id=%d) to slave %s", operation, target, id, endpoint))
  85. } else {
  86. common.SysLog(fmt.Sprintf("[RegionSync] Successfully pushed %s %s to slave %s", operation, target, endpoint))
  87. }
  88. }
  89. // recordSyncLog 创建同步日志记录
  90. func recordSyncLog(userId, remoteUserId int, syncType string, requestId string) {
  91. syncLog := &model.QuotaSyncLog{
  92. UserId: userId,
  93. RemoteUserId: remoteUserId,
  94. SyncType: syncType,
  95. Direction: model.SyncDirectionCnToOv,
  96. Status: model.SyncStatusSuccess,
  97. RequestId: requestId,
  98. CreatedAt: time.Now().Unix(),
  99. }
  100. if err := model.CreateSyncLog(syncLog); err != nil {
  101. common.SysError(fmt.Sprintf("[RegionSync] Failed to create sync log: %v", err))
  102. }
  103. }