高流量 Web 应用程序中用户会话的良好替代方案?
在以下场景中,什么是好的/可扩展的用户会话替代方案:
- 用户不必启用 cookie
- URL 查询字符串限制为 255 个字符
- 大量 GET 请求(无隐藏表单字段)
- 应用程序在多个服务器(网络场)上运行
- 一些用户通过代理(相同 IP)连接
- 用户通过 HTTPS 连接
- 50 000 个并发用户
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果您可以保证客户端始终连接到同一 Web 服务器,则可以使用 SSL ID 作为简单的会话跟踪机制。某些 Web 服务器公开此功能,并在不支持 cookie 时自动使用它进行会话跟踪。
无论如何,唯一可行的解决方案是在 URL 本身中包含会话 ID。向 URL 添加参数是最简单的方法,但 ID 可以嵌入 URL 中的任何位置,即作为路径的一部分。您可以使用此 ID 从数据库中获取有关用户的信息。
当然,您会遇到常见的问题,如 ID 欺骗和会话数据库成为瓶颈。
If you can guarantee that the client always connects to the same web server, you can use the SSL ID as a simple session tracking mechanism. Some web servers expose this capability and automatically use it for session tracking when cookies aren't supported.
The only solution that will work no matter what is to include a session ID in the URL itself. Adding a parameter to the URL is the simplest way to do this, but the ID can be embedded anywhere in the URL, i.e. as part of the path. You would use this ID to fish information about the user out of a database.
You will run into the usual problems, of course, with ID spoofing and having the session database be a bottleneck.
首先,恕我直言,除了会话之外没有好的替代方案。问题是当cookies被禁用时你如何获取它。答案是使用 URL 参数。因此,您必须将会话 ID 附加到每个请求(包括链接和表单)。所有其他要求并不真正相关。使您的逻辑无状态,这样您就不会遇到可扩展性问题:所有请求都应通过负载均衡器到达您的逻辑,因此您可以根据需要添加任意数量的服务器。
First, IMHO, there is no good alternative to session. The question is how do you obtain it when cookies are disabled. The answer is using URL parameter. So, you have to append session id to each request (including links and forms). All other requirements are not really relevant. Make your logic stateless, so you do not have scalability problems: all requests should arrive to your logic via load ballancer, so you can add as many servers as you want.
也许是 URL 重写 或某些 URI 缩短机制,例如 http://tinyurl.com 或 http://goo.gl 所以您可以在 255 个字符以内传递会话详细信息。
注意:不推荐使用这些服务,而是推荐使用该机制。
Maybe URL Rewriting or some URI shortening mechanism like http://tinyurl.com or http://goo.gl so you can pass your session details well under 255 chars.
Note: Not recommending to use these services but the mechanism.
首先,你的要求非常严格。
我看到的唯一选择是使用这样的方法: http://code.google.com/p/ seaside/
简而言之:您的系统将生成无状态网址,例如
http://host/app/@123445568978
然后您将继续在数据库上获取会话对象。
First of all, your requirements are very tight.
The only option I see is using an approach like this: http://code.google.com/p/seaside/
In short: your system will generate statless urls like
http://host/app/@123445568978
Then you will go on the db to get the session object.
5万用户在做什么?连续拖放位置更新到服务器或每 15 分钟单击一个文本链接?在最后一种情况下:将所有内容移动到具有大量内存的单个服务器上。
50000 users doing what? Continuous drag-and-drop with position updates to the server or clicking a text link every 15 minutes? In the last case: move everything onto a single server with a lot of ram.