如何取消订阅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 它刚刚实

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

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]
  }
}