当前位置: 首页 > 知识库问答 >
问题:

PubSub长轮询

锺离伟彦
2023-03-14

长轮询在GCP PubSub JS SDK上可用吗?

我希望能够同时处理多个PubSub消息,例如:

这是它将如何在AWS上工作的一个示例:

  1. SQS队列包含超过5条消息。
  2. 侦听器receiveMessage将在单个receive中一次获得5条消息。事件
// Load the AWS SDK for Node.js
var AWS = require("aws-sdk");
// Set the region
AWS.config.update({ region: "REGION" });
// Set the AWS Region
const REGION = "us-east-1"; //e.g. "us-east-1"

// Set the parameters
const queueURL =
  "https://sqs.us-east-1.amazonaws.com/763335115465/long-polling-per-message"; // SQS_QUEUE_URL
const params = {
  AttributeNames: ["SentTimestamp"],
  MaxNumberOfMessages: 5,
  MessageAttributeNames: ["All"],
  QueueUrl: queueURL,
  WaitTimeSeconds: 20,
};

// Create SQS service object
const sqs = new AWS.SQS({
  region: REGION,
  credentials: {
    accessKeyId: "xx",
    secretAccessKey: "xxx",
  },
});

sqs.receiveMessage(params, function (err, data) {
  console.log({ err, data: JSON.stringify(data) });
  if (err) {
    console.log("Receive Error", err);
  } else if (data.Messages) {
    var deleteParams = {
      QueueUrl: queueURL,
      ReceiptHandle: data.Messages[0].ReceiptHandle,
    };
    sqs.deleteMessage(deleteParams, function (err, data) {
      if (err) {
        console.log("Delete Error", err);
      } else {
        console.log("Message Deleted", data);
      }
    });
  }
});


{
  "ResponseMetadata": { "RequestId": "25295507-c4ae-5106-a499-0d7808c163b8" },
  "Messages": [
    {
      "MessageId": "5dbd863e-2c50-49c8-9c4b-9f70e8db8d17",
      "ReceiptHandle": "asdf",
      "MD5OfBody": "78ef53e38c997c445f2fe1cc63c13139",
      "Body": "Test5",
      "Attributes": { "SentTimestamp": "1610991641728" }
    },
    {
      "MessageId": "09baf624-f2ee-4173-83ed-e74c0516a7e6",
      "ReceiptHandle": "asdf",
      "MD5OfBody": "c454552d52d55d3ef56408742887362b",
      "Body": "Test2",
      "Attributes": { "SentTimestamp": "1610991983369" }
    },
    {
      "MessageId": "1cac914f-d946-434a-87a0-974b14cc2eba",
      "ReceiptHandle": "asdf",
      "MD5OfBody": "b3f66ec1535de7702c38e94408fa4a17",
      "Body": "Test3",
      "Attributes": { "SentTimestamp": "1610991986299" }
    },
    {
      "MessageId": "95c2c8ad-fc7a-451a-b967-8ce1736a4cab",
      "ReceiptHandle": "asdf",
      "MD5OfBody": "f178860b5109214d9f3debe19a7800d3",
      "Body": "Test7",
      "Attributes": { "SentTimestamp": "1610991998129" }
    },
    {
      "MessageId": "3711fa29-9bbc-418d-a35f-7adbd7daa952",
      "ReceiptHandle": "asd",
      "MD5OfBody": "b6e30158b9d7d2dc8bb4f4123fe93c9b",
      "Body": "Test10",
      "Attributes": { "SentTimestamp": "1610992008975" }
    }
  ]
}

共有1个答案

甄越
2023-03-14

Cloud Pub/Sub JS库提供了一个流式的、每条消息的API,用于从订阅中接收消息。没有办法告诉库给您一批N条消息,所以您必须自己实现它。

 类似资料:
  • 问题内容: 我最近在StackOverflow上问了一个有关我的功能的问题,人们建议我使用Ajax Long Polling。我花了几天的时间研究该主题,并尝试编写基本的长轮询代码,但是这些代码都没有起作用,而且我什么也做不了。 这是我的基本功能: 有人能够告诉我如何将其转变为基本的长轮询功能,或者甚至直接指向我需要到达的路径。很感谢任何形式的帮助。谢谢! 问题答案: 通常(即,当不使用长时间轮询

  • 长轮询是与服务器保持持久连接的最简单的方式,它不使用任何特定的协议,例如 WebSocket 或者 Server Sent Event。 它很容易实现,在很多场景下也很好用。 常规轮询 从服务器获取新信息的最简单的方式是定期轮询。也就是说,定期向服务器发出请求:“你好,我在这儿,你有关于我的任何信息吗?”例如,每 10 秒一次。 作为响应,服务器首先通知自己,客户端处于在线状态,然后 —— 发送目

  • 问题内容: 我正在研究ajax长期轮询,但感到困惑。传统的ajax调用和长时间轮询有什么不同 此示例仅以递归方式调用服务器。与setInterval中的传统调用不同。 问题答案: 顾名思义,“ 长时间轮询” 意味着长时间轮询某些内容。 这是实际过程的开始,您对服务器上的某个脚本进行ajax调用,在本例中为,您需要使服务器脚本(例如)足够智能,以便仅在所需数据可用时才响应请求,该脚本应等待指定的时间

  • 我想测量和比较长轮询和WebSocket之间的服务器性能。我用ratchet(PHP websockets)构建了一个简单的PHP应用程序,它只在控制台中输出数据(指南:http://socketo.me/docs/hello-world)。长轮询应用程序也是PHP,只生成随机数并将其记录在控制台中(本文:如何实现基本的“长轮询”?)。 有没有办法在不使用数据库的情况下对这些应用程序进行公平的比较

  • 我想在Spring Boot中遇到下面的用例。 我有一个第三方REST API,如果有任何东西要返回,它会尽快返回响应,或者花10秒钟发送空白响应。 我需要连续调用这个API,这意味着如果API返回响应,将该响应发送到进程,然后再次调用该API,这意味着我需要长时间轮询该API,但没有时间间隔,一旦我得到响应,就再次轮询。 我要独立线程处理响应。 这不是web应用程序。我只想用纯java(spri