2016-10-25 3 views
-1

직장에서 우리는 모든 마이크로 서비스에 Python 2.7을 사용합니다. 우리의 서비스의 대부분은 비즈니스 로직이 거의 없지만 모든 준비된 플러그 앤 플레이 프레임 워크를 사용하지 않을 정도로 충분합니다. 그래서 대부분 프론트 엔드 반응 대시 보드를위한 REST/CRUD입니다. 그래서 우리는 사용Python async webservers

파이썬 2.7

  • 에게 헥타르 프록시를 로빈에게 서버와 서비스 간의 통화를 반올림.
  • 각 서버에서 nginx를 구문 분석하고 uwsgi를 호출합니다.
  • 다중 프로세스 (물론 코드는 스레드로부터 안전하지 않습니다)를 처리하는 uwsgi - CPU 당 프로세스 2 개, 프로세스 당 스레드 1 개.
  • 내부적으로 호출을 라우팅하는 피라미드는 SQL 서버를 사용하여 MySQL 서버와 연결합니다. 의존성 주입
  • 에 대한
  • 탄성 검색
  • 카우치베이스 주식회사
  • 스프링 파이썬은 가정의 무리가이 모든 것을 결합하고 사용할 수 있도록하는 래퍼를했다.
  • JSON은 사방

우리는 또한 노동자와 RPC가 rabbitmq와 연결되어 있습니다.

내가 말했듯이, 서버에 대한 대부분의 작업은 : 요청/json을 구문 분석하고, SQL 또는 탄성 검색 쿼리를 수행하고, 프런트에 대한 형식을 지정하고 응답하는 것입니다. 요청을 수행 할 때 너무 느린 IO가 많습니다. 이제 inter-services 호출이 점점 더 많아지고 http 호출 또는 rmq-rpc와 rabbitmq를 사용합니다. Google은 라우트를 호출하여 라우트 러를 설계하여 http 또는 rmq-rpc에서 아무런 차이없이 호출 할 수 있습니다.

C#/go 배경으로, 나는 많은 문제없이 비동기를 처리 할 수있는 효율적인 웹 서버를 갖는 데 익숙하며, http 호출 중에 많은 IO 요청을하더라도 크기를 조정할 수 있습니다. 하지만 uwsgi를 사용하면이 작업이 거의 불가능하며 SQL-alchemy를 통해 MySQL을 호출 할 때마다 전체 스레드/프로세스를 차단하므로 그 이상의 확장이 불가능하므로 더 많은 서버를 추가하기 만하면됩니다. 우리는 CPU 당 더 많은 프로세스를 추가 할 수 있지만 잘못 생각하고 단지 pub를 지연시킬 수 있으며 메모리 문제가 발생할 수 있습니다. 우리는 일을 빠르게하기 위해 로컬 캐시가 있습니다.

그래서 저는 파이썬에서 비동기적인 것들, gevent, 토네이도, 트위스트 등, 그 위대한 보였지만 didnt는 SQL 연금술과 잘 작동하는 것 같습니다. 플라스크에 관한 것들, Django. 그러나 우리는 복잡한 웹 프레임 워크를 필요로하지 않으며 단순한 http 라우팅 만 필요로합니다.

스택은 3 살이며 모든 것을 바꿀 수는 없습니다. 상품 뉴스, 우리는 uwsgi와 피라미드에 매우 느슨한 결합을 가지고 있지만 스프링 Python과 SQL 연금술은 매우 밀접하게 결합되어 있습니다. 우리는 우리의 라우트를 쓰레드 세이프 (safes)로 만드는 방법을 찾을 수 있습니다.

제 질문은 제가 말씀 드렸듯이, 그 어려운 제약 조건으로 어떤 스택을 추천 하시겠습니까?

  • http-rpc는 동일하게 처리해야합니다.
  • rpc는 rabbitmq를 거치지 않아도됩니다.
  • json (예를 들어 protobuf로 이동할 수 없습니다). 대부분의 경로는 "데이터베이스"(SQL 또는 탄성 또는 couchbase) 호출에 대한 래퍼 일 뿐이므로 대부분 IO 바인딩입니다.
  • 우리는 레거시 코드의 많은이 없다, 그래서 처음

나는 몇 가지 아이디어를 주위 테스트 할 계획입니다부터 시작하지만, 당신이 올바른 방향으로 날 지점 수 있다면, 그것은 나에게 많은 시간을 절약 할 수 있습니다.

보너스 : 처음부터 다시 시작해야한다면 무엇을 사용 하시겠습니까? (여전히 파이썬 2.7과 SQL 연금술을 사용)

당신의 도움을 위해 Thx.

면책 조항 : 나는이 개방형 질문의 일종 알고 있지만 the last questions에 대한 the subject 스택에 least 3 years old에 있습니다. I posted the same question on reddit without luck.

답변

0

저는 여러분이 비동기를 지원하는 db 드라이버를 사용해야한다고 생각합니다. 포스트 그레스에 대한 psycopg2는 이것을 생각할 수 있습니다.

sqlalchemy 또는 피라미드의 직접적인 문제는 아닙니다 (특히 피라미드에서 전역을 사용하지 않도록 설정할 수 있으므로).

필자는 피라미드와 gevent가 포함 된 websocket 서버를 작성했으며 훌륭하게 작동합니다. 그것은 sqlalchemy를 사용하지 않지만 트릭은 asynchroneous 인 sqlalchemy 코드에 대해 범위가 지정된 세션을 사용하지 않아야한다는 것입니다.