使用AWS SQS的最有效方式(使用Golang)

问题描述 投票:0回答:2

使用AWS SQS(简单队列服务)时,您需要为服务的每个请求付费(推,拉,...)。每个可以发送到队列的消息最多为256kb。

为了省钱,我想在发送到我的Go应用程序之前缓冲消息,然后再将它发送到SQS,直到我有足够的数据来有效地使用256kb限制。

由于我的Go应用程序是一个Web服务器,我目前的想法是使用字符串互斥并附加消息,只要我超过256kb限制然后发出SQS推送事件。为了节省更多空间,我可以在将每个消息附加到字符串互斥锁之前对其进行gzip。

我想知道是否有某种gzip流可供我使用。我的假设是将所有连接的消息压缩在一起将导致更小的大小,然后在将每个消息附加到字符串互斥锁之前对其进行gzipping。一种方法是在每次追加后对字符串互斥进行gzip以验证其大小。但这可能会非常缓慢。

有没有更好的办法?或者是否有更好的方法涉及渠道?我还是新来的Go我必须承认。

amazon-web-services go gzip amazon-sqs
2个回答
0
投票

我采取以下方法

  • 使用通道接受传入的“内部”消息到go例程
  • 在该例程中,将消息保持为“原始”格式,因此10条消息是10个未压缩的原始项目
  • 每次新的原始项目到达时,将所有原始消息压缩为一个。如果新消息的大小> 256k,则压缩消息除了最后一个消息并推送到SQS

这在计算上很昂贵。每条消息都会导致所有待处理消息的完全压缩。但是它对于SQS的使用是有效的


0
投票

您可以猜测gzip压缩消息的大小,并计算您是否已达到最大大小阈值。跟踪消息大小计数器,并为每个新消息增加计数器的预期压缩大小。进行实际压缩并仅在您的计数器超过256kb时发送到SQS。因此,每次有新消息进入时都可以避免压缩。对于这样的用例,对一组示例消息运行一些测试应该给出预期的粗略压缩百分比。

© www.soinside.com 2019 - 2024. All rights reserved.