2012-05-25 2 views
10

타사 웹 API에서 실시간 데이터를 가져 와서이를 MySQL 데이터베이스에 저장하고 HTTP/JSON API를 통해 사용할 수 있도록 해주는 웹 백엔드/API 공급자를 연구 중입니다.이벤트 릿/일반 비동기 입출력 작업 세분화

플라시보를 제공하고 SQLAlchemy Core를 사용하여 DB로 작업하고 있습니다.

실시간 데이터 잡는 부분에는 요청을 보내서 반환 된 XML을 파이썬 dict로 구문 분석하고 반환하여 타사 API를 래핑하는 함수가 있습니다. 이 API 래퍼를 호출 할 것입니다.

그런 다음 각 데이터를 사용하는 다른 메소드 내에서 이러한 함수를 호출하고 필요에 따라 처리 (예 : 시간대 변환 등) 한 다음 DB에 저장합니다. 우리는이 프로세서들을 호출 할 것입니다.

비동기 I/O 및 이벤트 릿에 대해 특별히 읽었으며 매우 감동했습니다.

나는 코드를 잡아 내 데이터를 통합 할거야,하지만 난 먼저 몇 가지 질문이있다 : 그것은 원숭이 패치 모든 것에 나를 위해 안전

  1. 입니까? 내가 플라스크, SQLAlchemy 및 다른 libs를 가지고 있다고 생각하면, (지연 바인딩이 없다고 가정 할 때) 원숭이 패치에 대한 단점이 있습니까?

  2. 작업을 분할해야하는 입체 성은 무엇입니까? 나는 주기적으로 프로세서를 생성하는 풀을 생성 할 생각이었다. 그런 다음 프로세서가 API 래퍼를 호출하는 부분에 도달하면 API 래퍼는 eventlet.green.urllib2를 사용하여 실제 HTTP 데이터를 가져 오는 GreenPile을 시작합니다. 이것은 좋은 접근 방법입니까?

  3. 타임 아웃 - 나는 아무런 글렌드 ​​글도 걸리지 않도록하고 싶습니다. eventlet을 설정하는 좋은 접근 방법인가? 각 greenthread마다 10-15 초 가량 소요됩니까?

참고로 약 10 개의 서로 다른 실시간 데이터 세트가 있고 프로세서는 5 ~ 10 초마다 생성됩니다.

감사합니다.

답변

3

Flask/SQLAlchemy를 비동기 스타일 (또는 이벤트 기반) 프로그래밍 모델과 혼합하는 것이 현명하지 않다고 생각합니다.

그러나 중개 스토리지로 RDBMS (MySQL)를 사용하고 있다고 명시 했으므로 RDMBS에 제 3 자 웹 서비스의 결과를 저장하는 비동기 작업자를 만들고 프론트 엔드 (Flask/SQLAlchemy) 동기?

그런 경우에는 Flask 또는 SQLAlchemy를 monkeypatch 할 필요가 없습니다.

세분성과 관련하여 mapreduce 패러다임을 사용하여 웹 API 호출 및 처리를 수행 할 수 있습니다. 이 패턴은 논리적으로 연속 된 단계를 분리하는 방법과 관련된 프로세스를 제어하는 ​​방법에 대한 아이디어를 줄 수 있습니다.

개인적으로 저는 개인적으로 이것을 수행하기 위해 비동기 프레임 워크를 사용하지 않을 것입니다. Celery 또는 Hadoop과 같은 실제 mapreduce 종류의 다중 처리를 사용하는 것이 더 좋습니다.

단순한 힌트 : 간단하고 모듈화 된 상태로 유지하고 성능을 더 필요로하는 경우 나중에 최적화하십시오. 이것은 정보가 얼마나 실시간으로 필요로하는지에 의해 크게 영향을받을 수 있습니다.

+0

귀하의 의견에 감사드립니다. 나는 Flask와 Async I/O를 섞지 않는다는 것에 동의한다 - 내 질문에는 분명하지 않아야하지만, API (Flask)는 패치되지 않은 비동기 I/O 프로세스가 별도로 실행된다. 데이터 그래버는 단순화 목적으로 SQLAlchemy Core (ORM 아님)를 사용하여 db에 쓰는 패치 된 프로세스에서 실행됩니다. – user1094786

+0

OK,이 경우 이미이 방법을 사용하고 있습니다. 데이터 그래버에 비동기가 필요한지 궁금합니다. 특히 데이터 수집기가 CPU를 많이 사용하는 경우 다른 동시성 방법 (다중 처리, 셀러리 등)을 사용하는 것이 좋습니다. 셀러리에 대해 –

+0

+1. 작업은 좋은 후보로 보입니다. – Tisho

-1

순수 파이썬과 표준 lib를 사용하여 작성한 모듈을 패치하는 것이 안전합니다.

  • PyMysql은 SQLAlchemy의 테스트 스위트를 가지고
  • , 당신은 당신의 경우에 대한 테스트를 실행할 수 있습니다 :

    • 몇 순수 MySQL의 어댑터가 있습니다.
    • symalchemy 용 dialect를 제공하는 pymysql_sa 모듈이 있습니다.
    • Flask는 순수 Python 및 100 % WSGI 1.0 준수로 작성되었습니다. 서비스를 제공하려면 eventlet.wsgi을 사용하십시오.

    가능한 한 녹색 모듈을 사용하여 단일 페치로 작업을 나누십시오. 작업을 큐에 넣습니다.이 큐는 이벤트 릿에 의해 제공되며, 모든 작업 작업자는 큐에서 작업을 가져온 다음 작업을 페치 한 후 db에 결과를 저장하거나 이벤트로 보냅니다. 두 가지 과정 모두.

    eventlet 공식 문서가 강하게 메인 모듈의 주먹 라인에 패치를 사용하는 것이 좋습니다, 그것은 여러 번 monkey_patch 전화 안전 :

    이 업데이트되었습니다. 페이지의 전체 내용보기 http://eventlet.net/doc/patching.html

    일부 녹색 모듈은 이벤트 릿으로 작업 할 수 있으며, 모두 eventlet.green에 있습니다. bitbucket에 대한 목록. 코드에서 녹색 모듈을 사용하고 있는지 확인하거나 표준 라이브러리를 사용하는 3 번째 모듈을 가져 오기 전에 패치하십시오.

    monkey_patch는 소수의 모듈 만 허용하므로 녹색 모듈을 수동으로 가져와야합니다.

    def monkey_patch(**on): 
        """Globally patches certain system modules to be greenthread-friendly. 
    
        The keyword arguments afford some control over which modules are patched. 
        If no keyword arguments are supplied, all possible modules are patched. 
        If keywords are set to True, only the specified modules are patched. E.g., 
        ``monkey_patch(socket=True, select=True)`` patches only the select and 
        socket modules. Most arguments patch the single module of the same name 
        (os, time, select). The exceptions are socket, which also patches the ssl 
        module if present; and thread, which patches thread, threading, and Queue. 
    
        It's safe to call monkey_patch multiple times. 
        """  
        accepted_args = set(('os', 'select', 'socket', 
             'thread', 'time', 'psycopg', 'MySQLdb')) 
        default_on = on.pop("all",None)