チャンクされた HTTP 応答を使用してクライアントにデータをストリーミングする clojure Web アプリを作成しています。を使用してローカルで実行するとforeman
うまく動作しますが、Heroku にデプロイすると正しく動作しません。
この動作を示す最小限の例は、私の github here にあります。フロントエンド ( resources/index.html
) は AJAX GET 要求を実行し、応答チャンクが到着すると出力します。サーバーは http-kit を使用して、接続されたクライアントに毎秒新しいチャンクを送信します。設計上、HTTP 要求は決して完了しません。
同じコードが Heroku にデプロイされると、最初のチャンクが送信された直後に HTTP 接続がサーバーによって閉じられます。この切断が発生する原因となっているのは、Heroku のルーティング メッシュのようです。
これは、curl を使用して GET リクエストを実行することでも確認できます。
$ curl -v http://arcane-headland-2284.herokuapp.com/stream
* About to connect() to arcane-headland-2284.herokuapp.com port 80 (#0)
* Trying 54.243.166.168...
* Adding handle: conn: 0x6c3be0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x6c3be0) send_pipe: 1, recv_pipe: 0
* Connected to arcane-headland-2284.herokuapp.com (54.243.166.168) port 80 (#0)
> GET /stream HTTP/1.1
> User-Agent: curl/7.31.0
> Host: arcane-headland-2284.herokuapp.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Date: Sat, 17 Aug 2013 16:57:24 GMT
* Server http-kit is not blacklisted
< Server: http-kit
< transfer-encoding: chunked
< Connection: keep-alive
<
* transfer closed with outstanding read data remaining
* Closing connection 0
curl: (18) transfer closed with outstanding read data remaining
The time is currently Sat Aug 17 16:57:24 UTC 2013 <-- this is the first chunk
なぜこれが起こっているのか誰にも示唆できますか?HTTP ストリーミングは、Heroku の Cedar スタックでサポートされるはずです。を使用してコードが正しく実行されるという事実はforeman
、Heroku のルーティング メッシュの何かが壊れていることを示唆しています。
失敗したプロジェクトのライブ デモ: http://arcane-headland-2284.herokuapp.com/