1

I want to send messages to a FIFO sqs queue. Given a array of list different user ids, for each id, I want to call sendMessage command to send the id as message body. I'm expecting every time it will return a different message id, but actually they all return same messageId. Sample code below:

const sendMessage = async (params:ISqsRequestParam) => {
  try {
    const sqsResponse = await sqsClient.send(new SendMessageCommand(params));
    console.log(`send message response: ${JSON.stringify(sqsResponse)}`);
    return sqsResponse.MessageId; // For unit tests.
  } catch (err) {
    console.error('SQS sending', err);
  }
};

export const handler = async function (event: IEventBridgeAddtionalParams, context: Context): Promise<string[]> {
  console.info(`${context.functionName} triggered at ${event.time} under ${process.env.NODE_ENV} mode`);
  console.info(`customor parameter value is ${event.custom_parameter}`);
  try {
    const sqsUrl: string = event.custom_parameter === 'Creator' ? process.env.BATCH_CREATOR_QUEUE_URL : process.env.BATCH_PROCESSOR_QUEUE_URL;
    console.info(`SQS Url is: ${sqsUrl}`);
    const tenantData: ITenantResponse = await fetchAllTenantIds();
    console.info(`ResponseDate from tenant service: ${JSON.stringify(tenantData.value)}`);

    // change to fix tenantId for development environment for better debugging and test
    const data : ITenantDetails[] = process.env.NODE_ENV !== 'production' ? fixedTenantDataForNonProd() : tenantData.value;
    const promise = data.map(async tenantDetails => {
      if (!tenantDetails.tenantFailed) {
        console.info(`Tenant Id in message body: ${tenantDetails.id}`);

        const params: ISqsRequestParam = {
          MessageBody: tenantDetails.id,
          MessageDeduplicationId: `FP_Tenant_populator_${event.custom_parameter}`,  // Required for FIFO queues
          MessageGroupId: `FP_Tenant_populator_Group_${event.custom_parameter}`,  // Required for FIFO queues
          QueueUrl: sqsUrl //SQS_QUEUE_URL; e.g., 'https://sqs.REGION.amazonaws.com/ACCOUNT-ID/QUEUE-NAME'
        };
        const messageId:string = await sendMessage(params);
        return messageId; //for unit testing
      } else {
        return null; //for unit testing
      }
    });
    const messageIds:string[] = await Promise.all(promise); //for unit testing
    const activeMessageIds:string[] = messageIds.filter(id=> id!= null); //for unit testing
    console.info(`Success, ${activeMessageIds.length} messages sent. MessageID:${activeMessageIds[0]}`);
    return activeMessageIds; //for unit testing
  } catch (error) {
    console.error(`Fetch tenant details error: ${error}`);
  }
};
John Rotenstein
  • 241,921
  • 22
  • 380
  • 470
Fang Yuan
  • 11
  • 1
  • I fixed it, need to set MessageDeduplicationId and MessageGroupId to be different when sending message to the sqs every time. – Fang Yuan Mar 03 '22 at 03:20

0 Answers0