Giter Site home page Giter Site logo

tiproxy's Introduction

tiproxy

Proxy accepts connections and translates them into the child process. It maintains a single child process when there are active incoming connections.

Quick start

curl+ncat

$ go build 
$ ./tiproxy --dest 127.0.0.1:3000 --exec ncat --workdir /usr/sbin -- -l -k -p 3000 -4 -v
$ curl -v http://127.0.0.1:4000/api

broker-ncat+nc

$ go build 
$ ./tiproxy --dest 127.0.0.1:3000 --exec ncat --workdir /usr/sbin -- -l -k -p 3000 -4 -v --broker
terminal X: $ nc -t 127.0.0.1 4000
terminal Y: $ echo HELLO | nc -t 127.0.0.1 4000
terminal Z: $ telnet 127.0.0.1 4000
terminal Z: > blah [ press ENTER ]

TiDB with docker-compose

$ go build
$ cp tiproxy docker/bin
$ docker build -t tiproxy:latest ./docker
$ docker-compose -f ./docker/docker-compose.yml up 
$ mysql --host 127.0.0.1 --port 4000 -u root
$ mysql --host 127.0.0.1 --port 4000 -u root

Architecture

Client -> Proxy -> Pool -> Resource
  |
  conn ->  get  ->  if ->  exists
                     |       |
  done <----------- conn <---/
                     |
                    else -> spawn \
                     or      |    |
                    wait <---/    |
                     |            |
  done <----------- conn          |
  ...                             |
release -> put       /------------/
            |        |           
  done  <-  *        v (spawn monitor)            
                    ...
                  Monitor Resource
                  timeout and no connections
                     |  ->  kill
                     |       | 
                   killed <- /        
                     |
                    exit

Pool uses sync.Cond to control state transitions between executing coroutines. A calling coroutine processes pool state change. Every new resource has its own controlling monitor that exits as soon as resource disappears.

Pool uses sync.Mutex to control its state. States switch between: closed, opened, starting, shutdown. Pool tracks usage statistics counting connections and keeping the latest change time.

Resource monitor respects SIGCHLD signals.

Proxy uses io.Copy creating 2 coroutines to serve TCP connections 2-way.

tiproxy's People

Contributors

sitano avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.