Как реализовать механизм очереди в ASP.Net Core 2.1 с AWS - PullRequest
0 голосов
/ 03 октября 2019

У меня есть ASP.Net Core 2.1 приложение с AWS в качестве облака. И я хочу реализовать механизм очереди.

У меня есть API, как показано ниже.

public class UserControler : ControllerBase
{
      [HttpPost]
      public asyn Task<IActionResult> Post([FromBody]UserTO user)
      {
         //Step#1 Insert the user record in the db
         bool flag = await _userService.Add(user).ConfigureAwait(false); // async Task

         //Step#2 If the db operation is successful, send an email to user email
         if(flag)
             await _emailService.Send(user.email).ConfigureAwait(false); //async Task
      }
 }

HttpResponse возвращается после выполнения двух асинхронных методов. Но я хочу

  1. Вставить записи в db (_userService.Add (user)
  2. Затем какой-нибудь механизм очереди, в котором задача отправки электронной почтыдобавлен в очередь. Вернуть ответ вызывающей стороне
  3. Теперь это будет очередь, которая будет решать задачу отправки электронной почты

Это только один раз, задача очереди может быть чем угоднокак sendemail или uploadtos3, создает что-либо еще и т.д. *

1 Ответ

0 голосов
/ 07 октября 2019

Кажется, что для этого экземпляра очередь будет избыточной, но вы определенно можете использовать для этого Simple Queue Service.

Когда вы вставляете элемент в SQS, вы можете настроить его на использование функции Lambda. сработать и вытащить элемент из очереди и обработать его. Здесь - хорошее руководство от AWS о том, как это можно сделать. .NET SDK также содержит некоторую приличную документацию и примеры использования SQS.

Но, если бы это был я, я бы, вероятно, выбрал бы использование Dynamo Stream для запуска лямбда-функции. По сути, после вставки строки вы можете запустить лямбда-функцию для выполнения и обработки некоторых данных. Таким образом, в вашем случае после вставки вы можете активировать функцию отправки электронного письма этому пользователю, используя данные из этой строки.

Это пример лямбда-кода, который будет выполняться.

using System;
using System.IO;
using System.Threading.Tasks;
using Amazon.DynamoDBv2.Model;
using Amazon.Lambda.Core;
using Amazon.Lambda.DynamoDBEvents;
using Newtonsoft.Json;

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace LocalDynamoDbStream
{
    public class Function
    {
        private static readonly JsonSerializer JsonSerializer = new JsonSerializer();

        public Task FunctionHandler(DynamoDBEvent dynamoEvent, ILambdaContext context)
        {
            context.Logger.LogLine($"Beginning to process {dynamoEvent.Records.Count} records...");

            foreach (var record in dynamoEvent.Records)
            {
                context.Logger.LogLine($"Event ID: {record.EventID}");
                context.Logger.LogLine($"Event Name: {record.EventName}");

                var streamRecordJson = SerializeStreamRecord(record.Dynamodb);
                context.Logger.LogLine("DynamoDB Record:");
                context.Logger.LogLine(streamRecordJson);

                // Do your email here using data from new inserted row
                var email = record.Dynamodb.NewImage["email"].S;
                await _emailService.Send(email).ConfigureAwait(false);
            }

            context.Logger.LogLine("Stream processing complete.");

            return Task.CompletedTask;
        }

        private static string SerializeStreamRecord(StreamRecord streamRecord)
        {
            using (var writer = new StringWriter())
            {
                JsonSerializer.Serialize(writer, streamRecord);
                return writer.ToString();
            }
        }
    }
}

Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...