http - 如何取消订阅 http 处理程序?

标签 http session go handler unsubscribe

我想创建 http 处理程序来处理一个 session :

func init(){
    http.HandleFunc("/sess/215489598", func(w http.ResponseWriter, r *http.Request) {
        //do something
    })
}

然后在 session 结束(过期)时将其删除。

我该怎么做?

最佳答案

这不是直接可能的:HTTP 多路复用器(ServeMux 类型)不会公开删除操作。

事实证明,使用 HTTP 多路复用器进行 session 管理并不是一个好主意。 HTTP 服务的当前实现是 kind of inefficient.它会为每个 URL 扫描整个多路复用器表,因此您拥有的处理程序越多,性能就越差。这对于一些路径来说没问题,但您甚至无法以这种方式管理数百个 session ,更不用说数十万个了。

HTTP 多路复用器需要某种同步才能用作 session 管理工具。假设有一个 Unhandle 方法。如果您取消处理一条路径,您会期望多路复用器不再使用其先前的数据处理您的路径。但是,不同的 goroutines aren't guaranteed to see each other's changes to the same data without some kind of synchronization.因此,HTTP 处理程序仍然可以看到多路复用器的旧 View ,然后使用您认为已注销的处理程序响应请求。

因此,HTTP 处理程序本身不能为您执行此操作 - 也不应该这样做,因为您没有任何方法来同步您的 session 生命周期。

"/sess/" 创建一个处理程序。该处理程序应负责委托(delegate)给各个 session 。它可以使用 map[sessionID]sessionHandler 高效地执行此操作,并且可以将所有 session 管理通过 channel 进行管道传输,让单个 goroutine 跟踪正在创建和销毁的 session ,或者使用更传统的在 session 映射周围使用读写锁的方法。这样,您可以确保在删除 session 处理程序后不会尝试将新请求分派(dispatch)给 session 处理程序。

当然,您随时都可以收到 HTTP 请求,因此如果在您决定后指令中发生上下文切换,那么有人可能会在您锁定 map 以删除 session 之前跳入并连接到 session 你想锁定 map ,但在你真正这样做之前,所以仔细管理你的锁和 session 策略。此处“正确的事情”主要取决于您的个人应用程序的需求。

关于http - 如何取消订阅 http 处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15916195/

相关文章:

go - 单个 channel 上的多个接收器。谁得到数据?

Python urllib2 给出错误 503

c# - 易于模拟的 C# HTTP 客户端框架

php - 当 php session 超时时执行一些事件

delphi - Intraweb 可以运行超过 65,536 个并发 session 吗?

session - 访问我的 Axis2 Web 服务时 Chrome 丢失 session

java - 如果 http 请求的内容类型是 urlencoded,如何让 Spring Boot Controller 读取对对象的 http 请求正文?

javascript - AngularJS 重复 http 请求

go - 创建实现接口(interface)的结构实例的函数

Go:制作一个可从其他 Go 应用程序调用的守护进程