Compartilhe banco de dados entre 2 aplicativos no Heroku

89

Quero acessar o banco de dados de um aplicativo de outro aplicativo Heroku. Isso é possível no banco de dados compartilhado?

Donald
fonte

Respostas:

100

ATUALIZADA

Originalmente, essa resposta afirmava que, embora isso fosse possível com alguns truques, era fortemente desencorajado. Isso foi baseado no conselho do site de suporte ao desenvolvedor do Heroku. No entanto, recentemente o Heroku emitiu uma comunicação descrevendo especificamente como fazer isso e diluiu seus conselhos no site do desenvolvedor. O texto completo desta seção de seu e-mail está incluído abaixo:

Você sabia que os aplicativos Heroku podem compartilhar um banco de dados comum? Por exemplo, você pode colocar funções analíticas em um aplicativo separado do código voltado para o usuário.

Basta definir a var de configuração DATABASE_URL para vários aplicativos com o mesmo valor. Primeiro, obtenha o DATABASE_URL para seu aplicativo existente:

$ heroku config | grep DATABASE_URL  --app sushi DATABASE_URL => postgres://lswlmfdsfos:[email protected]/ldfoiusfsf

Em seguida, defina DATABASE_URL para novos aplicativos com este valor:

$ heroku config:add DATABASE_URL=postgres://lswlmfdsfos:[email protected]/ldfoiusfsf --app sushi-analytics
Adding config vars: DATABASE_URL => postgres://lswlm...m/ldfoiusfsf Restarting app... done, v74. That's it

- agora ambos os aplicativos compartilharão um banco de dados.

Apenas como referência, o conselho original do Heroku era criar e usar uma API para acessar dados remotamente. Minha opinião pessoal é que, em geral, para muitas situações, este é um bom conselho (ou seja, melhor do que apenas conectar vários aplicativos ao mesmo banco de dados), embora eu possa ver situações em que isso seria mais problemático do que vale a pena.

ATUALIZAR

De acordo com os comentários sobre esta resposta, é importante notar que o Heroku se reserva o direito de alterar os URLs do banco de dados conforme necessário. Se isso ocorrer, as conexões secundárias falharão e você precisará atualizar os URLs de acordo.

Paul Russell
fonte
1
apenas configure aplicativos no Heroku para provar que é possível - detalhes na minha resposta.
John Beynon
1
Muito justo, voto negativo retratado ... Apoio Heroku dá uma resposta diferente! Pergunta: Se eu desenvolver dois aplicativos heroku, eles podem acessar um único banco de dados? A razão de eu perguntar é que temos um aplicativo rails e um aplicativo sinatra, e eles precisam compartilhar um banco de dados postgres. Prefiro não fazer isso por http! Resposta do suporte do heroku: Sim, se você precisar, você pode. Cada aplicativo Heroku obtém um banco de dados provisionado por padrão, mas é possível para um aplicativo usar o banco de dados de outro aplicativo simplesmente copiando a var de configuração DATABASE_URL de um aplicativo para outro.
John Beynon
1
Retirei o voto negativo, mas a resposta aceita ainda está incorreta, apenas como um FYI.
John Beynon
1
eles dizem que se reservam o direito de alterar o URL do banco de dados de seus aplicativos, então, se isso ocorrer, você precisará alterar o URL do banco de dados que estava usando manualmente.
John Beynon
7
agora existe uma maneira heroku oficial de compartilhar DATABASE_URL entre aplicativos. veja a resposta de @ c360ian abaixo .
mobeets de
81

Resposta de última hora à pergunta pertinente!

O Heroku oferece suporte oficialmente para uma solução melhor / elegante por meio de seu framework adicional agora. Ele é descrito em seu boletim informativo mais recente sobre como compartilhar addons entre aplicativos. Abaixo estão os snippets mencionados no artigo:

$ heroku addons:attach my-sushi-db -a my-sushi-reporting --as MAIN_SUSHI_DB    
  Adding MAIN_SUSHI_DB to my-sushi-reporting... done
  Setting MAIN_SUSHI_DB vars and restarting my-sushi-app-reporting... done, v3

Link: expansion_the_power_of_add_ons

c360ian
fonte
Muito obrigado !, esta deve ser a resposta prioritária!
HLL
2
Esta é a resposta certa. Todas as outras respostas estão obsoletas e, de qualquer forma, a maioria delas são duplicadas.
Jelder
3
O formato do comando que usei foiheroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
Marklar
15

até onde eu sei, é possível - você terá que olhar as variáveis ​​de configuração do heroku para o seu aplicativo com o banco de dados e, em seguida, definir o database_url no aplicativo que deseja compartilhar o banco de dados com o mesmo valor. Meio fora do caminho e quanto ao suporte, eu não sei.

EDITAR Só para descansar, criei dois aplicativos no Heroku - uma simples 'postagem' de suporte com um título.

http://evening-spring-734.heroku.com/posts é o mestre

http://electric-galaxy-230.heroku.com/posts - é o escravo

Portanto, as postagens criadas em qualquer um deles serão gravadas na URL do banco de dados evening-spring-734.

Tudo o que fiz foi usar a configuração do heroku para obter o DATABASE_URL de evening-spring-734 e definir o mesmo valor em DATABASE_URL de electric-galaxy-230.

Você pode acabar com algumas condições de corrida DB frutadas, mas é definitivamente possível fazer.

Magic hein?

John Beynon
fonte
+1: Eu vejo isso como sendo muito útil para fazer URLs curtos ou intuitivos .. como myapp.me/iwasrobbed (Heroku App # 1) redireciona para myapp.com/users/1 (Heroku App # 2), pois agora posso armazenar o nome personalizado no banco de dados do usuário padrão. Obrigado John!
iwasrobbed
1
heroku pg: promotion DATABASE_URL --app your_app_name é a forma suportada de definir esta variável.
Neil Middleton
meu único comentário é sobre as condições de corrida. Os trabalhadores e a instância da web seriam os mesmos, assim como os trabalhadores remotos, como iron worker ou resqueue.
baash05
12

Recebi isso no boletim informativo do Heroku recentemente. Estou enviando um e-mail para eles para descobrir se realmente é um uso aprovado.

VOCÊ SABIA?

Compartilhando um banco de dados com muitos aplicativos

Você sabia que os aplicativos Heroku podem compartilhar um banco de dados comum? Por exemplo, você pode colocar funções analíticas em um aplicativo separado do código voltado para o usuário.

Basta definir a DATABASE_URL var de configuração para vários aplicativos com o mesmo valor. Primeiro, obtenha o DATABASE_URLpara seu aplicativo existente:

$ heroku config | grep DATABASE_URL  --app sushi
DATABASE_URL   => postgres://lswlmfdsfos:[email protected]/ldfoiusfsf

Em seguida, defina o DATABASE_URLpara novos aplicativos com este valor:

$ heroku config:add DATABASE_URL=postgres://lswlmfdsfos:[email protected]/ldfoiusfsf --app sushi-analytics
Adding config vars: DATABASE_URL => postgres://lswlm...m/ldfoiusfsf
Restarting app... done, v74.

É isso - agora os dois aplicativos irão compartilhar um banco de dados.

JoshRivers
fonte
4
Perguntei ao Heroku sobre o uso desse método para obter um dinamômetro da Web e um Worker gratuitos. Aqui está a resposta deles. >> "Josh - desencorajamos fazer isso, mas, além disso, haveria problemas com o trabalhador ocioso. Uma vez que estivesse ocioso, ele parava de fazer qualquer trabalho e sem nada para 'acordá-lo' como uma solicitação da web, seria inútil como trabalhador. "<< Portanto, parece que você pode usar vários aplicativos no mesmo banco de dados, mas não é muito útil de graça.
JoshRivers
Estou usando para fins de desenvolvimento, já tenho milhares de linhas em meu aplicativo ao vivo, e a nova aparência está sendo desenvolvida em outro aplicativo heroku menor, então poder compartilhar dados é legal, posso desenvolver e ver os novos looks com o mesmos dados
Dvid Silva
7

O plugin Amazon RDS funciona bem para isso. Vários aplicativos podem compartilhar a mesma instância RDS.

Você tem a flexibilidade de fazer com que eles compartilhem tabelas ou evitar a colisão de nomes de tabelas usando o active_record.table_name_prefix.

Steve Wilhelm
fonte
1

Consulte a referência do Heroku: https://devcenter.heroku.com/categories/heroku-postgres

P: Vários aplicativos Heroku podem se conectar a um único banco de dados?

Sim. Você pode configurar vários aplicativos em execução no Heroku para se conectar a um único banco de dados, desde que você tenha as credenciais do banco de dados. Simplesmente substitua o DATABASE_URL dos aplicativos que você deseja conectar usando a configuração do heroku: adicione o comando DATABASE_URL = ....

jmk
fonte