__init__.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import json
  2. import tornado.httpserver
  3. import tornado.ioloop
  4. import tornado.web
  5. from tornado.options import define, options, parse_command_line
  6. import os
  7. from .generator import Generator
  8. _ENV_NAME_DC = 'PSF_DC'
  9. _ENV_NAME_WORKER = 'PSF_WORKER'
  10. try:
  11. _PSF_DC = int(os.environ[_ENV_NAME_DC])
  12. except KeyError:
  13. _PSF_DC = 0
  14. try:
  15. _PSF_WORKER = int(os.environ[_ENV_NAME_WORKER])
  16. except KeyError:
  17. _PSF_WORKER = 0
  18. define("debug", default=False, help="run in debug mode", type=bool)
  19. define("address", default='localhost', help="run on the given address", type=str)
  20. define("port", default=8910, help="run on the given port", type=int)
  21. define("dc", default=_PSF_DC, help="Datacenter Identifier", type=int)
  22. define("worker", default=_PSF_WORKER, help="Worker Identifier", type=int)
  23. class IDHandler(tornado.web.RequestHandler):
  24. def get(self):
  25. generated_id = self.application.id_generator.get_next_id()
  26. self.set_header("Content-Type", "application/json")
  27. self.write(str(generated_id))
  28. self.flush() # avoid ETag, etc generation
  29. class StatsHandler(tornado.web.RequestHandler):
  30. def get(self):
  31. stats = self.application.id_generator.stats
  32. self.set_header("Content-Type", "application/json")
  33. self.write(json.dumps(stats))
  34. class SnowflakeApplication(tornado.web.Application):
  35. def __init__(self, **settings):
  36. handlers = [
  37. (r'/', IDHandler),
  38. (r'/stats', StatsHandler),
  39. ]
  40. settings = {
  41. 'debug': options.debug,
  42. }
  43. self.id_generator = Generator(options.dc, options.worker)
  44. super(SnowflakeApplication, self).__init__(handlers, **settings)
  45. def main(): # pragma: no cover
  46. import logging.config
  47. import logging
  48. import os.path
  49. # setup logging
  50. logging.config.fileConfig(os.path.abspath(os.path.join(
  51. os.path.dirname(__file__),
  52. 'logging.ini',
  53. )))
  54. tornado.options.parse_command_line()
  55. http_server = tornado.httpserver.HTTPServer(SnowflakeApplication())
  56. print("Starting snowflake start at %s:%d" % (options.address, options.port))
  57. http_server.listen(options.port, options.address)
  58. try:
  59. tornado.ioloop.IOLoop.instance().start()
  60. except Exception:
  61. logging.exception('Snowflake server error')
  62. if __name__ == "__main__":
  63. main()