2014-04-16 2 views
1

나는 Python으로 Heroku 앱을 작성하려고하는데, 이는 xively 피드의 데이터를 실시간으로 읽고 저장합니다. 나는 앱이 데이터를 단순히 데이터베이스에 저장하는 일종의 '백엔드 프로세스'로서 독립적으로 실행되기를 원한다. (사이트 방문자에게 사용자를 위해 어떤 것도 제공 할 필요가 없습니다.)(python) heroku 앱에서 지속적으로 데이터를 읽는 방법?

지금은 '계속 읽기'부분을 작업 중입니다. 나는 아래에 나의 코드를 포함시켰다. 단순히 앱의 Heroku URL에 도달 할 때마다 데이터 스트림을 한 번 읽습니다. 어떻게 연속적으로 작동시켜 데이터를 계속 읽을 수있게합니까?

import os 
from flask import Flask 
import xively 

app = Flask(__name__) 

@app.route('/') 
def run_xively_script(): 

    key = 'FEED_KEY' 
    feedid = 'FEED_ID' 


    client = xively.XivelyAPIClient(key) 
    feed = client.feeds.get(feedid) 
    datastream = feed.datastreams.get("level") 

    level = datastream.current_value 


    return "level is %s" %(level) 

나는 웹 개발, Heroku가, 그리고 파이썬에 새로운 오전 ... 나는 어떤 도움 (포인터) 감사 정말 것이다

{ PS : 나는 Heroku가 스케줄러에 대해 그리고 내가 이해에서 읽고 , 특정 시간 간격으로 작업을 예약하는 데 사용할 수 있으며 작업을 수행 할 때 해당 작업에 대해 일회성 dyno를 시작합니다. 그러나 앞서 언급 한 것처럼 내 앱은 실제로 하나의 기능 만 수행하여 연속적으로 데이터를 읽고 저장합니다. 이를 위해 별도의 작업을 예약해야합니까? 그리고 스케쥴러가 시작할 일회용 다이노는 또한 dyno 시간을 소모 할 것입니다. 이는 내 앱의 웹 dyno가 이미 720 dyno-hour/month를 소비하므로 무료 750 dyno-hour 제한을 초과 할 것이라고 생각합니다. }

답변

2

여러분과 @Calumb이 제안한 것처럼 스케줄러를 사용하면이 문제를 해결할 수있는 한 가지 방법입니다.

또 다른 방법은 Xively에서 트리거를 설정하는 것입니다. https://xively.com/dev/docs/api/metadata/triggers/

피드가 업데이트되면 트리거가 발생합니다. 방아쇠가 Flask 앱에 POST되어야하고, Flask 앱은 새로운 데이터를 가져 와서 조작하고 원하는대로 저장할 수 있습니다. Xively가 업데이트를 시스템에 적용하기 때문에 이것이 거의 실시간에 가까울 것이라고 생각합니다.

+0

입력 해 주셔서 감사합니다. 이것은 가장 실시간 (효율적인) 접근 방식과 같이 보입니다. 트리거를 잠시 설정하는 것만으로도 충분하지만, Flask 앱이 POST에 응답하는 것은 복잡해 보입니다 ... 유용한 정보를 찾을 수있는 포인터/링크가 정말 좋을 것입니다 ... – user3482357

+0

나는 API를 작성하는 데 안성맞춤 인 Flask의 팬입니다. Flask의 인터페이스와 유사합니다. 안정적으로 GET, POST 등을 쉽게 정의 할 수 있습니다. 이미 가지고있는 것을 고수하고 싶다면 라우트 데코레이터는 @ app.route ('/ xivelytrigger', methods = [ 'POST'])와 비슷할 것입니다. 코드는 게시물의 본문을 읽고 데이터를 구문 분석하고 DB에 저장합니다. 그렇다면 Xively에 대한 POST 응답은 아무 것도 될 수 없다 (나는 생각한다). 나는 Xively와 함께 일한 것이 아니므로 확실히 말할 수는 없지만 Flask POST 부분은 나쁘지 않습니다. – TimothySwieter

1

이 질문은 상위 수준 아키텍처 결정과 수행해야 할 구체적인 작업에 대해 설명합니다.

궁극적으로, 플라스크는 아마도 앱이 사용자가하려는 일을하는 최선의 선택이 아닙니다. 순수 파이썬이나 순수한 루비로 더 나아질 수 있습니다. 그 말로는 Heroku 스케줄러 (당신이 언급 한)를 사용하면 당신이하려고하는 것과 같은 것을 할 수 있습니다.

목표를 달성하는 가장 간단한 방법은 (최소한의 코드를 변경하고 끊임없이 데이터를 읽는 것이 실제로하고 싶은 일이라고 가정 할 때 모두 고려해야합니다) 루프가 당신은 그 일을 부르고 데이터를 몇 초 동안 붙잡습니다. for 루프를 사용하고 데이터를 가져 오려는 횟수만큼 카운터를 증가시킵니다. 같은

뭔가 :

for i in range(0,5): 
    key = 'FEED_KEY' 
    feedid = 'FEED_ID' 
    client = xively.XivelyAPIClient(key) 
    feed = client.feeds.get(feedid) 
    datastream = feed.datastreams.get("level") 

    level = datastream.current_value 

    time.sleep(1) 

그러나, Heroku가은 값을 반환하기 전에 실행할 수 있습니다 얼마나 오래 뭔가에 한계가있다. 그렇지 않으면 라우터는 503 또는 500을 반환합니다. 그러나 스케줄러를 사용하여 일정한 시간마다 실행되도록 스케줄을 지정할 수 있습니다.

다시 말하지만 플라스크와 헤로 쿠는 당신이하려고하는 것처럼 가장 좋은 해결책이 아닙니다. 귀하의 유스 케이스를 검토하고 드로잉 보드로 돌아가서 가장 좋은 방법을 찾아 보겠습니다.

+0

내가 (Heroku + Flask 앱) 내가하고 싶은 일에 이상적인 방법이 아니라고 의심하기 시작했다. (걱정할 필요가있다.) xively 데이터는 매 20 초마다 업데이트되므로 매 20 초마다 저장됩니다. 당신이 말한 것 (503/500 ...)과 Heroku 스케줄러가 최소한 10 분 간격으로 작동한다는 사실에서, Heroku 스케줄러와 루프 접근 방식은 작동하지 않을 것이라고 생각합니다. (@TimothySwieter) (나는 그것에게 시도를 줄 것이다. ..) 도와 줘서 고마워! – user3482357

+0

루프를 사용해 보았습니다. (언급했듯이) 앱에서 약 30 분 동안 URL을 클릭 한 다음 브라우저에서 '응용 프로그램 오류'가 발생하면 앱이이 기능을 수행합니다. heroku 로그는 다음과 같이 말합니다 : {heroku [router] : at = 에러 코드 = H12 desc = "요청 제한 시간"method = GET path =/host = ... request_id = ... fwd = "..."dyno = web. 1 연결 = 1ms 서비스 = 30000ms 상태 = 503 바이트 = 0}. 루프 접근법은 처음부터 운명 지어졌습니다. – user3482357