alissonfreire / octos-challenge

0 stars 0 forks source link

Fannout Oban #7

Open lpcinelli opened 4 days ago

lpcinelli commented 4 days ago

Não entendi o motivo do uso do fannout, não seria apenas cada envio de email ser um job distinto no Oban?

Do jeito que você descreveu no README, parece que apenas 1 job envia todos os emails, daí sua sugestão para esse fanout, em que cada job envia apenas um email e agenda o próximo job de envio de 1 email. Se minha compreensão está correta, essa aboradagem ainda serializa o envio dos emails e cria uma interdependência (se falhar mais do que máx retries em um dado envio, não vai enviar os emails restantes da lista)

Por que não fazer cada job responsável pela criação (NotifyUserEmail.notify/1') e envio de cada email (Mailer.deliver/1) individualmente, criar todos os jobs de uma só vez e enfileirar?

Caso eu tenha entendido errado, por favor me corrija.

alissonfreire commented 4 days ago

Acabei deixando alguns pontos implícitos na explicação do fannout o que deixou minha explicação confusa.

Basicamente o job do fannout teria o trabalho de buscar todos os usuários quem possuem a câmera da marca X e para cada usuário retornado ele cria um outro job passando o usuário, ou o mais usual apenas o id, como argumento. A tarefa desse segundo job é de fato apenas enviar o email.

O ponto implícito da minha explicação foi o cenário que essa abordagem melhor se aplicava, pois era um problema corriqueiro que eu tinha no meu outro emprego.

O cenário era o seguinte: tínhamos uma tela busca de entidades(uma liveview), por exemplo, produtos, pedidos, usuários etc... . Essa tela possuía filtros, a ação de search, que retornavam milhares de registros, e as ações, que basicamente enfileiravam jobs do Oban para cada registro retornado.

Qual era o problema aqui? Fazer múltiplas inserções de jobs no banco(ainda mais no contexto de uma liveview) era muito arriscado, além de ser um pouco demorado, pois eventualmente tinhamos problema de conexão com o banco, o que poderia deixar alguns dos registros retornados na busca ficarem sem job. Tem outro detalhe é que o Oban na versão free não tinha a função insert_all o que dificultava um pouco nossa vida. Outra vantagem do fannot é que como era um job tinha a garantia do banco, ficava registrado e virava métrica