我试图想出在AWS缩放聊天服务的最佳解决方案。 我想出了几个可能的解决方案:
Redis的发布/订阅 - 当用户建立至该服务器预订该用户的ID服务器的连接。 当有人将消息发送到该用户,服务器将进行发布与用户的ID通道。 用户连接到该服务器将接收该消息,并将它推下到适当的客户端。
SQS - 我想为每个用户创建一个队列。 用户连接的服务器,将轮询(或使用SQS长轮询),该队列。 当发现一个新的消息,这将被推到从服务器的用户。
SNS - 我真的很喜欢这个解决方案,直到我发现了100主题限制。 我需要为每个用户创建,这将只支持100个用户的一个话题。
是他们的任何其他方式聊天可以使用AWS扩展? 是SQS的做法是否可行? 多长时间需要AWS将消息添加到队列中?
构建聊天服务并不像你想象的那么简单。
我已经建立了完整的XMPP服务器,客户端和SDK的和可以证明出现的一些微妙和困难的问题。 其中,用户看到对方聊天的原型很容易。 一个完整的功能系统,帐户创建,安全性,发现存在,下线交付和朋友列表是更是一个挑战。 然后,为了扩大跨服务器的任意数量的特别困难。
PubSub的是即时信息服务提供的功能( 见XEP-60 ),而不是建立一个聊天服务的传统手段。 我可以看到的吸引力,但PubSub的可以有缺点。
有些问题你:1.你在Web上这样做呢? 是用户将被连接和长极化或者你有一个Web套接字的解决方案?
有多少用户? 多少每个用户连接? 写的比读?
您的使用SQS这样的想法很有趣,但可能不会扩大。 这是不寻常的有50K或更多的用户聊天服务器上。 如果你是轮询各SQS队列为每一个用户,你不会得到附近的任何地方。 你会过得更好为每个服务器一个队列,服务器轮询只有队列。 然后,它的你要弄清楚用户是在什么服务器和消息放入正确的队列。
我怀疑你会想要去是这样的:
- 在后端大RDS数据库。
- 一束前端服务器处理的客户端连接的。
- 一些中间层Java / C#代码追踪一切,将消息路由到正确的地方。
抢建一个聊天服务器的复杂的想法阅读XMPP RFC的: RFC 3920 RFC 3921
SQS / SNS可能不适合你的健谈的要求。 我们已经观察到一些SQS潜伏期可能不适合聊天应用。 此外SQS不保证FIFO。 我有Redis的AWS上工作。 如果它被配置以记住所有的最佳实践,是很容易的,稳定的。
我想过使用构建SNS聊天服务器,但是在做每个用户一个话题,你形容,做整个聊天系统一个主题,让每个服务器订阅主题 - 每个服务器运行某种长轮询或网络插座聊天系统。 然后,当一个事件发生时,数据在SNS通知的有效载荷发送。 然后,服务器可以使用该有效载荷,以确定哪些在排队的客户应该得到的回应,留下任何无关的客户不变。 其实,我建立了一个小样机这一点,但还没有做一吨的测试,看看它的强大足以让大量的用户。
HI实时聊天不与SNS很好地工作。 它是专为电子邮件/短信或服务1或几秒钟的延迟是可以接受的。 实时聊天,1或几秒钟是不能接受的。
检查此链接
Latency (i.e. “Realtime”) for PubNub vs SNS
亚马逊SNS不提供延迟保证,且绝大多数延迟都超过1秒测量,并且经常是许多秒慢。 再次,这是多少有些不相关的; 亚马逊SNS是专为服务器到服务器(或电子邮件/ SMS)的通知,其中的许多秒的等待时间往往是可接受的,并且预期。
因为PubNub经由现有建立开放的网络套接字传送数据,等待时间下从发布订阅的装置的95%百分位数订阅0.25秒。 大多数人认为某件事为“实时”如果事件0.6中感知 - 0.7秒。
我想实现这样的事情(如果不使用某些框架)的方法如下:
具有接受来自用户的封邮件网络服务器(上EC2)。 使用Autoscalling组对这个网络服务器。 Web服务器可以在Amazon RDS可轻松扩展更新任何数据库。
如果你正在使用自己的数据库,你可能会考虑(通过发送所有请求相同的队列)去耦使用SQS Web服务器的数据库,然后ü可以有一个消费者,其消费的队列。 此消费者也可以放置一个autoscalling组的后面,这样,如果该队列是大于X的MSG时,它会扩展(u能使用报警设置它)
SQS正常更新蛮快的,即不到一秒。 (从目前ü发送它,它出现在队列中的时刻),而且很少不止于此。
由于新的AWS服务的IoT开始支持WebSockets的,保持连接和发布/订阅几个月前,你可以很容易地建立在它的弹性聊天。 AWS物联网是有很多的软件开发工具包为不同的语言包括JavaScript,这是建立处理怪物负载(10亿的消息)与零管理的托管服务。
你可以阅读更多关于更新在这里:
https://aws.amazon.com/ru/about-aws/whats-new/2016/01/aws-iot-now-supports-websockets-custom-keepalive-intervals-and-enhanced-console/
编辑:
最后SQS更新(一十一分之二千○十六):你现在可以使用亚马逊简单队列服务(SQS)对于要求严格的顺序处理的消息,准确地使用一次先入先出(FIFO)队列的应用程序。 FIFO队列被设计成确保在消息发送和接收的顺序被严格保存和被处理正好一次每条消息。
来源: https://aws.amazon.com/about-aws/whats-new/2016/11/amazon-sqs-introduces-fifo-queues-with-exactly-once-processing-and-lower-prices-for-标准的队列/
现在,实施SQS + SNS看起来像一个好主意了。