如何取消订阅http处理程序?
我想创建http处理程序来处理一个会话:如何取消订阅http处理程序?,http,session,go,handler,unsubscribe,Http,Session,Go,Handler,Unsubscribe,我想创建http处理程序来处理一个会话: func init(){ http.HandleFunc("/sess/215489598", func(w http.ResponseWriter, r *http.Request) { //do something }) } 然后在会话结束(过期)时将其删除 我该怎么做?恐怕golanghttp包目前还没有实现删除或修改http处理程序的方法,请阅读: src/pkg/net/http/server.go 它刚刚实
func init(){
http.HandleFunc("/sess/215489598", func(w http.ResponseWriter, r *http.Request) {
//do something
})
}
然后在会话结束(过期)时将其删除
我该怎么做?恐怕golang
http
包目前还没有实现删除或修改http处理程序的方法,请阅读:
src/pkg/net/http/server.go
它刚刚实现了寄存器函数HandleFunc()
您有两种解决方法:
1修改源代码以实现注销功能。这是不可取的,因为直接使用ServerMux
不是一个好主意
或:
2.也许你把事情弄得更复杂了。您只需要在常规处理程序函数中解析/sess/215489598
,例如:
func Handler(response http.ResponseWriter, request *http.Request) {
modules := strings.Split(request.URL.Path, "/")
if modules[1] == "sess" {
session_id := modules[2]
}
}
然后您就知道下一步该怎么做了:)这不是直接可能的:HTTP多路复用器(类型ServeMux)不会公开删除操作 使用HTTP多路复用器进行会话管理是个坏主意。HTTP服务的当前实现是扫描每个URL的整个多路复用器表,因此处理程序越多,性能越差。对于一些路径来说,这是很好的,但是您甚至无法通过这种方式管理几百个会话,更不用说几十万个会话了 HTTP多路复用器需要某种同步才能用作会话管理工具。假设有一个未处理的方法。如果您取消处理路径,您将期望多路复用器不再使用以前的数据处理您的路径。但是,在不同的goroutine中,HTTP处理程序仍然可以看到多路复用器的旧视图,然后使用您认为已注销的处理程序响应请求 因此,HTTP处理程序本身不能为您做到这一点,也不应该这样做,因为您没有任何方法来同步会话寿命 为
“/sess/”
创建单个处理程序。该处理程序应负责将任务委托给各个会话。它可以使用map[sessionID]sessionHandler
来高效地完成这项工作,并且可以通过通道对所有会话进行管道管理,以让单个goroutine跟踪正在创建和销毁的会话,或者采用更传统的方法,在会话映射周围使用读写器锁。这样,您可以确保在删除会话处理程序后不会尝试将新请求分派给它
当然,您可以随时获得HTTP请求,因此在您锁定映射以删除会话之前,可能会有人跳入并连接到会话。如果在您决定要锁定映射之后,但在您实际执行之前,指令中发生了上下文切换,请仔细管理您的锁定和会话策略。这里的“正确做法”主要取决于您个人应用程序的需要。如果您使用Gorilla tookit,它不需要为每个请求扫描整个路由表。
func Handler(response http.ResponseWriter, request *http.Request) {
modules := strings.Split(request.URL.Path, "/")
if modules[1] == "sess" {
session_id := modules[2]
}
}