Проблема параллелизма БД с лайками постовC#

Место общения программистов C#
Ответить
Anonymous
 Проблема параллелизма БД с лайками постов

Сообщение Anonymous »

У меня есть метод Like, этот метод должен добавлять записи лайков пользователей к сообщению, а также добавлять лайки, это обычная проблема для параллелизма. что меня на самом деле беспокоит, так это maxRetryAttempts = 50, я точно не знаю, следует ли мне повторять это бесконечно или давать максимальное количество повторных попыток.
Проблема в том, что если я решу этот способ :

Код: Выделить всё

public async Task Like(LikeDto dto)
{
async Task likeAndSave(Rating rating, bool isLiked)
{
bool like() => rating.Like(_auth.User, rating.OfferId, isLiked);
var liked = false;

try
{
liked = like();
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
_context.Entry(rating).Reload();
liked = like();
await _context.SaveChangesAsync();
//Concurrency conflic my occur again here.
}

return liked;
}

var rating = await _context.Set()
.Include(e => e.Likes.Where(e => e.User.Id == _auth.UserId))
.FirstOrDefaultAsync(e => e.OfferId == dto.Id);
var liked = await likeAndSave(rating, dto.Liked);

return rating.Analytics;
}
Затем я переработал LikeAndSave, чтобы использовать повторную попытку.

Код: Выделить всё

public async Task Like(LikeDto dto)
{
async Task likeAndSave(bool isLiked, int maxRetryAttempts = 50)
{
TimeSpan pauseBetweenFailures = TimeSpan.FromSeconds(2);
var liked = false;
Rating rating = null;

AsyncRetryPolicy policy = Policy
.Handle()
.WaitAndRetryAsync(maxRetryAttempts, retryAttempt =>
TimeSpan.FromMilliseconds(pauseBetweenFailures.TotalMilliseconds * Math.Pow(2, retryAttempt - 1)));

await policy.ExecuteAsync(async () =>
{
rating = await _context.Set()
.Include(e => e.Likes.Where(e => e.User.Id == _auth.UserId))
.FirstOrDefaultAsync(e => e.OfferId == dto.Id);

liked = rating.Like(_auth.User, rating.OfferId, isLiked);

await _context.SaveChangesAsync();
});

return (rating, liked);
}

var (rating, liked) = await likeAndSave(dto.Liked);

return rating.Analytics;
}
Метод работает, отлично, просто интересно узнать о политике повторных попыток, есть ли что-нибудь более безопасное, чем это.

Подробнее здесь: https://stackoverflow.com/questions/791 ... post-likes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»