Realm Atlas Triggers Mimos e Triggers - Agendamento trigger baseado em documentos
Avalie esse Artigo
Nesta série de blogs, estamos tentando inspirá-lo com alguns casos de uso reativos do Realm trigger. Esperemos que isto o ajude a levar os seus pipelines de aplicação para o próximo nível.
Essencialmente, os gatilhos são componentes em nossos aplicativos Atlas Projects/Realm que permitem ao usuário definir uma função personalizada a ser invocada em um evento específico.
- Gatilhos de banco de dados: temos gatilhos que podem ser agendados com base em eventos de banco de dados, como
deletes
,inserts
,updates
ereplaces
- chamados de gatilhos de banco de dados. - Triggers programados: podemos agendar um trigger com base em uma expressão
cron
por meiode triggers programados. - Gatilhos de autenticação: esses gatilhos são relevantes apenas para autenticação de Realm. Eles são acionados por um dos eventos de autenticação dos provedores de autenticação do Realm e podem ser configurados apenas por meio de um aplicativo do Realm.
Para esta postagem do blog, gostaria de me concentrar nos padrões de agendamento de trigger.
Deixe-me apresentar um caso de uso e veremos como a mecânica discutida pode nos ajudar nesse cenário. Considere um aplicativo de gerenciamento de reuniões que agenda reuniões e, como parte de sua funcionalidade, precisa notificar um usuário 10 minutos antes da reunião.
Como criaríamos um trigger que seria acionado 10 minutos antes de um carimbo de data/hora que só é conhecido pelo documento " meeting "?
Primeiro, vamos dar uma olhada no exemplo de documentos da coleção de sessões:
1 { 2 _id : ObjectId("5ca4bbcea2dd94ee58162aa7"), 3 event : "Mooz Meeting", 4 eventDate : ISODate("2021-03-20:14:00:00Z"), 5 meetingUrl : "https://mooz.meeting.com/5ca4bbcea2dd94ee58162aa7", 6 invites : ["jon.doe@myemail.com", "doe.jonas@myemail.com"] 7 }
Queira compartilhar uma solução interessante com base em triggers e, ao longo deste artigo, usaremos um exemplo de notificação de reunião para explicar a abordagem discutida.
Primeiro, verifique se você tem um projeto do Atlas com privilégios de proprietário para criar triggers.
Se você ainda não configurou seu cluster gratuito no MongoDB Atlas, agora é um ótimo momento para fazer isso. Você tem todas as instruções nesta publicação no blog.
Usarei o exemplo de evento como um documento de origem iniciando o fluxo com uma inserção em uma collection
meetings
:1 { 2 _id : ObjectId("5ca4bbcea2dd94ee58162aa7"), 3 event : "Mooz Meeting", 4 eventDate : ISODate("2021-03-20:11:00:00Z"), 5 meetingUrl : "https://mooz.meeting.com/5ca4bbcea2dd94ee58162aa7" 6 invites : ["jon.doe@example.com"], 7 phone : "+123456789" 8 }
Depois de inserirmos este documento na collection
meetings
, ele criará o seguinte registro em uma collection auxiliar chamada notifications
usando um trigger de inserção:1 { 2 _id : ObjectId("5ca4bbcea2dd94ee58162aa7"), 3 triggerDate : ISODate("2021-03-10:50:00:00Z") 4 }
A hora e
_id
são calculadas a partir do documento de origem e têm como objetivo disparar quando 2021-03-10:50:00:00Z
chegar por meio de um trigger fireScheduleTasks
. Esse trigger é baseado em uma operação de exclusão de umTTL no campo triggerDate
do notifications
.É quando o usuário recebe o alerta!
Em um alto nível, aqui está o fluxo descrito acima.
Existem três componentes principais que permitem que nosso sistema seja trigger com base nos dados do documento.
Primeiro, precisamos preparar nossa coleção
notifications
. Esta coleção será criada implicitamente pelo seguinte comando de criação de índice.Agora criaremos um índice TTL. Esse índice fará com que o documento de agendamento expire quando o valor no campo
triggerDate
chegar a sua vida útil de expiração de 0 segundos após seu valor.1 db.notifications.createIndex( { "triggerDate": 1 }, { expireAfterSeconds: 0 } )
Ao configurar seu trigger
scheduleTasks
, certifique-se de fornecer o seguinte:- Serviço Atlas vinculado e verifique seu nome.
- O nome do banco de dados e da coleção em que baseamos o agendamento, por exemplo,
meetings
. - A operação de trigger relevante que queremos agendar, por exemplo, quando um evento é inserido.
- Vincule-o a uma função que executará a population de collection de cronograma.
Para preencher a coleção
notifications
com datas de acionamento relevantes, precisamos monitorar nossos documentos na coleção de origem. No nosso caso, os dados da próxima reunião do usuário são armazenados na coleção "meeting" com o campo userId. Nosso acionador monitorará as inserções para preencher um documento Scheduled.1 exports = function(changeEvent) { 2 // Get the notifications collection 3 const coll = context.services.get("<ATLAS-SERVICE>").db("<DATABASE>").collection("notifications"); 4 5 // Calculate the "triggerDate" and populate the trigger collection and duplicate the _id 6 const calcTriggerDate = new Date(changeEvent.fullDocument.eventDate - 10 * 60000); 7 return coll.insertOne({_id:changeEvent.fullDocument._id,triggerDate: calcTriggerDate }); 8 };
Importante: Substitua <ATLAS-SERVICE> e <DATABASE> pelos seus nomes de serviço e banco de dados vinculados.
Para React ao TTL "delete" event que acontece exatamente quando queremos que nossa tarefa agendada seja executada, precisamos usar um trigger de banco de dados "na exclusão" que chamei
fireScheduleTasks
.Ao configurar seu trigger
fireScheduleTasks
, certifique-se de fornecer o seguinte:- Serviço Atlas vinculado e verifique seu nome.
- O banco de dados e a coleção de notificações, por exemplo,
notifications
. - A operação de trigger relevante que queremos agendar, que é "DELETE".
- Vincule-o a uma função que executará a tarefa disparada.
Agora que preenchemos a coleção
notifications
com o triggerDate
, sabemos que o índice TTL disparará um evento de "exclusão" com o _id
excluído relevante para que possamos agir em nossa tarefa.No meu caso, 10 minutos antes do início do evento do usuário, meu documento atingirá sua vida útil e enviarei uma mensagem de texto usando o serviço Twilio para o telefone do participante.
Um pré-requisito para esse estágio será configurar um serviço do Twilio usando suas credenciais de cloud do Twilio.
- Configure o token SID e Auth na configuração de serviço Realm Twilio.
Depois de implementá-lo, podemos usá-lo para enviar notificações por SMS aos nossos convidados.
1 exports = async function(changeEvent) { 2 // Get meetings collection 3 const coll = context.services.get("<ATLAS-SERVICE>").db("<DATABASE>").collection("meetings"); 4 5 // Read specific meeting document 6 const doc = await coll.findOne({ _id: changeEvent.documentKey._id}); 7 8 // Send notification via Twilio SMS 9 const twilio = context.services.get("<TWILIO-SERVICE>"); 10 twilio.send({ 11 to: doc.phone, 12 from: "+123456789", 13 body: `Reminder : Event ${doc.event} is about to start in 10min at ${doc.scheduledOn}` 14 }); 15 };
Importante: Substitua <ATLAS-SERVICE> e <DATABASE> pelos seus nomes de serviço e banco de dados vinculados.
Foi assim que o evento foi disparado no momento apropriado.
Com a técnica apresentada, podemos aproveitar os padrões de trigger existentes para criar novos. Isso pode abrir sua mente para outras ideias para projetar seus próximos fluxos no MongoDB Realm.
No seguinte artigo desta série, aprenderemos como podemos implementar o incremento automático com triggers.
Se tiver dúvidas, acesse o site da nossa comunidade de desenvolvedores, no qual os engenheiros e a comunidade do MongoDB ajudarão você a desenvolver sua próxima grande ideia com o MongoDB.