使用AWS SQS(简单队列服务)时,您需要为服务的每个请求付费(推,拉,...)。每个可以发送到队列的消息最多为256kb。
为了省钱,我想在发送到我的Go应用程序之前缓冲消息,然后再将它发送到SQS,直到我有足够的数据来有效地使用256kb限制。
由于我的Go应用程序是一个Web服务器,我目前的想法是使用字符串互斥并附加消息,只要我超过256kb限制然后发出SQS推送事件。为了节省更多空间,我可以在将每个消息附加到字符串互斥锁之前对其进行gzip。
我想知道是否有某种gzip流可供我使用。我的假设是将所有连接的消息压缩在一起将导致更小的大小,然后在将每个消息附加到字符串互斥锁之前对其进行gzipping。一种方法是在每次追加后对字符串互斥进行gzip以验证其大小。但这可能会非常缓慢。
有没有更好的办法?或者是否有更好的方法涉及渠道?我还是新来的Go我必须承认。
我采取以下方法
这在计算上很昂贵。每条消息都会导致所有待处理消息的完全压缩。但是它对于SQS的使用是有效的
您可以猜测gzip压缩消息的大小,并计算您是否已达到最大大小阈值。跟踪消息大小计数器,并为每个新消息增加计数器的预期压缩大小。进行实际压缩并仅在您的计数器超过256kb时发送到SQS。因此,每次有新消息进入时都可以避免压缩。对于这样的用例,对一组示例消息运行一些测试应该给出预期的粗略压缩百分比。