You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

session_manager.go 2.3 kB

3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package getty
  2. import (
  3. "sync"
  4. "sync/atomic"
  5. "time"
  6. )
  7. import (
  8. getty "github.com/apache/dubbo-getty"
  9. )
  10. var (
  11. MAX_CHECK_ALIVE_RETRY = 600
  12. CHECK_ALIVE_INTERNAL = 100
  13. allSessions = sync.Map{}
  14. // serverAddress -> rpc_client.Session -> bool
  15. serverSessions = sync.Map{}
  16. sessionSize int32 = 0
  17. clientSessionManager = &GettyClientSessionManager{}
  18. )
  19. type GettyClientSessionManager struct{}
  20. func (sessionManager *GettyClientSessionManager) AcquireGettySession() getty.Session {
  21. // map 遍历是随机的
  22. var session getty.Session
  23. allSessions.Range(func(key, value interface{}) bool {
  24. session = key.(getty.Session)
  25. if session.IsClosed() {
  26. sessionManager.ReleaseGettySession(session)
  27. } else {
  28. return false
  29. }
  30. return true
  31. })
  32. if session != nil {
  33. return session
  34. }
  35. if sessionSize == 0 {
  36. ticker := time.NewTicker(time.Duration(CHECK_ALIVE_INTERNAL) * time.Millisecond)
  37. defer ticker.Stop()
  38. for i := 0; i < MAX_CHECK_ALIVE_RETRY; i++ {
  39. <-ticker.C
  40. allSessions.Range(func(key, value interface{}) bool {
  41. session = key.(getty.Session)
  42. if session.IsClosed() {
  43. sessionManager.ReleaseGettySession(session)
  44. } else {
  45. return false
  46. }
  47. return true
  48. })
  49. if session != nil {
  50. return session
  51. }
  52. }
  53. }
  54. return nil
  55. }
  56. func (sessionManager *GettyClientSessionManager) AcquireGettySessionByServerAddress(serverAddress string) getty.Session {
  57. m, _ := serverSessions.LoadOrStore(serverAddress, &sync.Map{})
  58. sMap := m.(*sync.Map)
  59. var session getty.Session
  60. sMap.Range(func(key, value interface{}) bool {
  61. session = key.(getty.Session)
  62. if session.IsClosed() {
  63. sessionManager.ReleaseGettySession(session)
  64. } else {
  65. return false
  66. }
  67. return true
  68. })
  69. return session
  70. }
  71. func (sessionManager *GettyClientSessionManager) ReleaseGettySession(session getty.Session) {
  72. allSessions.Delete(session)
  73. if !session.IsClosed() {
  74. m, _ := serverSessions.LoadOrStore(session.RemoteAddr(), &sync.Map{})
  75. sMap := m.(*sync.Map)
  76. sMap.Delete(session)
  77. session.Close()
  78. }
  79. atomic.AddInt32(&sessionSize, -1)
  80. }
  81. func (sessionManager *GettyClientSessionManager) RegisterGettySession(session getty.Session) {
  82. allSessions.Store(session, true)
  83. m, _ := serverSessions.LoadOrStore(session.RemoteAddr(), &sync.Map{})
  84. sMap := m.(*sync.Map)
  85. sMap.Store(session, true)
  86. atomic.AddInt32(&sessionSize, 1)
  87. }

Go Implementation For Seata