optimized socket notification on tag changes

This commit is contained in:
Maksim Chegulov 2023-09-04 13:20:32 +03:00
parent 4632b44767
commit 1f3d63be3d
5 changed files with 87 additions and 38 deletions

View File

@ -61,16 +61,7 @@ public class SocketServiceClient
}
try
{
var request = new HttpRequestMessage();
request.Headers.Add("Authorization", CreateAuthToken());
request.Method = HttpMethod.Post;
request.RequestUri = new Uri(GetMethod(method));
var jsonData = JsonConvert.SerializeObject(data);
_logger.DebugMakeRequest(method, jsonData);
request.Content = new StringContent(jsonData, Encoding.UTF8, "application/json");
var request = GenerateRequest(method, data);
var httpClient = _clientFactory.CreateClient();
//async
@ -100,11 +91,33 @@ public class SocketServiceClient
return JsonConvert.DeserializeObject<T>(resultMakeRequest);
}
protected void SendNotAwaitableRequest(string method, object data)
{
var request = GenerateRequest(method, data);
var httpClient = _clientFactory.CreateClient();
_ = httpClient.SendAsync(request);
}
private bool IsAvailable()
{
return _enableSocket && _lastErrorTime + _timeout < DateTime.Now;
}
private HttpRequestMessage GenerateRequest(string method, object data)
{
var request = new HttpRequestMessage();
request.Headers.Add("Authorization", CreateAuthToken());
request.Method = HttpMethod.Post;
request.RequestUri = new Uri(GetMethod(method));
var jsonData = JsonConvert.SerializeObject(data);
_logger.DebugMakeRequest(method, jsonData);
request.Content = new StringContent(jsonData, Encoding.UTF8, "application/json");
return request;
}
private string GetMethod(string method)
{

View File

@ -42,12 +42,12 @@
});
router.post("/markasnew-file", (req, res) => {
files.markAsNewFile(req.body);
files.markAsNewFiles(req.body);
res.end();
});
router.post("/markasnew-folder", (req, res) => {
files.markAsNewFolder(req.body);
files.markAsNewFolders(req.body);
res.end();
});
@ -62,4 +62,4 @@
});
return router;
};
};

View File

@ -171,11 +171,19 @@
filesIO.to(room).emit("s:markasnew-file", { fileId, count });
}
function markAsNewFiles(items = []) {
items.forEach(markAsNewFile);
}
function markAsNewFolder({ folderId, count, room } = {}) {
logger.info(`markAsNewFolder ${folderId} in room ${room}:${count}`);
filesIO.to(room).emit("s:markasnew-folder", { folderId, count });
}
function markAsNewFolders(items = []) {
items.forEach(markAsNewFolder);
}
function changeQuotaUsedValue({ featureId, value, room } = {}) {
logger.info(`changeQuotaUsedValue in room ${room}`, { featureId, value });
filesIO.to(room).emit("s:change-quota-used-value", { featureId, value });
@ -195,9 +203,9 @@
deleteFolder,
updateFile,
updateFolder,
markAsNewFile,
markAsNewFolder,
changeQuotaUsedValue,
changeQuotaFeatureValue,
markAsNewFiles,
markAsNewFolders
};
};

View File

@ -388,8 +388,8 @@ public class FileMarker
{
_semaphore.Release();
}
await Task.WhenAll(ExecMarkAsNewRequest(updateTags.Concat(newTags), socketManager));
await SendChangeNoticeAsync(updateTags.Concat(newTags), socketManager);
return;
@ -398,6 +398,7 @@ public class FileMarker
var tagDao1 = _daoFactory.GetTagDao<T1>();
var exist = await tagDao1.GetNewTagsAsync(userId, entries).ToListAsync();
var update = exist.Where(t => t.EntryType == FileEntryType.Folder).ToList();
update.ForEach(t => t.Count++);
updateTags.AddRange(update);
entries.ForEach(entry =>
@ -595,7 +596,9 @@ public class FileMarker
EntryType = r.EntryType
});
await Task.WhenAll(ExecMarkAsNewRequest(updateTags.Concat(toRemove), socketManager));
await SendChangeNoticeAsync(updateTags.Concat(toRemove), socketManager);
return;
async Task UpdateRemoveTags<TFolder>(Folder<TFolder> folder)
{
@ -1001,17 +1004,28 @@ public class FileMarker
_cache.Remove(key);
}
private IEnumerable<Task> ExecMarkAsNewRequest(IEnumerable<Tag> tags, SocketManager socketManager)
private static async Task SendChangeNoticeAsync(IEnumerable<Tag> tags, SocketManager socketManager)
{
foreach (var t in tags)
await ExecMarkAsync(tags.Where(t => t.EntryType == FileEntryType.File), socketManager.ExecMarkAsNewFilesAsync);
await ExecMarkAsync(tags.Where(t => t.EntryType == FileEntryType.Folder), socketManager.ExecMarkAsNewFoldersAsync);
return;
async Task ExecMarkAsync(IEnumerable<Tag> filteredTags, Func<IEnumerable<Tag>, Task> requestAction)
{
if (t.EntryType == FileEntryType.File)
const int packSize = 1000;
var count = filteredTags.Count();
var processed = 0;
while (processed < count)
{
yield return socketManager.ExecMarkAsNewFileAsync(t.EntryId, t.Count, t.Owner);
}
else if (t.EntryType == FileEntryType.Folder)
{
yield return socketManager.ExecMarkAsNewFolderAsync(t.EntryId, t.Count, t.Owner);
var pack = filteredTags.Skip(processed)
.Take(packSize)
.ToList();
processed += pack.Count;
await requestAction(pack);
}
}
}

View File

@ -33,7 +33,7 @@ public class SocketManager : SocketServiceClient
private readonly TenantManager _tenantManager;
public override string Hub => "files";
public SocketManager(
ILogger<SocketServiceClient> logger,
IHttpClientFactory clientFactory,
@ -47,7 +47,7 @@ public class SocketManager : SocketServiceClient
_tenantManager = tenantManager;
_folderDtoHelper = folderDtoHelper;
}
public async Task StartEditAsync<T>(T fileId)
{
var room = await GetFileRoomAsync(fileId);
@ -110,25 +110,39 @@ public class SocketManager : SocketServiceClient
await MakeRequest("delete-folder", new { room, folderId = folder.Id });
}
public async Task ExecMarkAsNewFileAsync(object fileId, int count, Guid owner)
public async Task ExecMarkAsNewFilesAsync(IEnumerable<Tag> tags)
{
var room = await GetFileRoomAsync(fileId, owner);
var result = await tags.ToAsyncEnumerable()
.SelectAwait(async tag => new
{
room = await GetFileRoomAsync(tag.EntryId, tag.Owner),
fileId = tag.EntryId,
count = tag.Count
})
.ToListAsync();
await MakeRequest("markasnew-file", new { room, fileId, count });
SendNotAwaitableRequest("markasnew-file", result);
}
public async Task ExecMarkAsNewFolderAsync(object folderId, int count, Guid owner)
public async Task ExecMarkAsNewFoldersAsync(IEnumerable<Tag> tags)
{
var room = await GetFolderRoomAsync(folderId, owner);
var result = await tags.ToAsyncEnumerable()
.SelectAwait(async tag => new
{
room = await GetFolderRoomAsync(tag.EntryId, tag.Owner),
folderId = tag.EntryId,
count = tag.Count
})
.ToListAsync();
await MakeRequest("markasnew-folder", new { room, folderId, count });
SendNotAwaitableRequest("markasnew-folder", result);
}
private async Task<string> GetFileRoomAsync<T>(T fileId, Guid? owner = null)
{
var tenantId = await _tenantManager.GetCurrentTenantIdAsync();
var ownerData = owner.HasValue ? "-" + owner.Value : "";
return $"{tenantId}-FILE-{fileId}{ownerData}";
}
@ -136,7 +150,7 @@ public class SocketManager : SocketServiceClient
{
var tenantId = await _tenantManager.GetCurrentTenantIdAsync();
var ownerData = owner.HasValue ? "-" + owner.Value : "";
return $"{tenantId}-DIR-{folderId}{ownerData}";
}
@ -162,4 +176,4 @@ public class SocketManager : SocketServiceClient
serializerSettings.Converters.Add(new FileEntryWrapperConverter());
return serializerSettings;
}
}
}