A Bionexo precisava evoluir sua principal plataforma digital para se manter relevante no mercado. Optou por desenvolver pequenos MVPs e migrar usuários aos poucos, ao invés de fazer tudo de uma vez. A estratégia envolveu migrar fornecedores e hospitais de forma gradual entre os sistemas antigo e novo. O processo enfrentou desafios como a integração de dados em tempo real e a correção de bugs.
5. Contexto
A Bionexo precisava evoluir para se manter relevante no mercado
Para evoluir, é preciso reescrever a sua principal plataforma digital
Usuários deverão migrar do sistema antigo para o sistema novo
6. Abordagem
Desenvolver todo o produto e migrar os usuários de uma vez
X
Desenvolver pequenos MVPs e migrar usuários aos poucos
12. Abordagem
Toda informação gerada no sistema clássico deve estar disponível no novo
sistema em tempo real
Cotações Respostas
Pedidos
confirmados
Negociações Contratos
27. Vários Pontos de Integração
Identificar a origem da mensagem para análise e correção de bugs
Mapeamos mais de 40 pontos de integração entre as plataformas
Incluir campo origem em cada mensagem
29. Ordem das Mensagens
Mensagens podem ser processadas fora da ordem (inconsistência)
A própria aplicação deve gerenciar a sequência das mensagens
Se a mensagem for antiga, ela deve ser descartada
35. Limite do Tamanho das Mensagens
A Amazon limita o tamanho das mensagens em até 256 KB
Uma cotação pode facilmente ultrapassar esse limite
Dividir uma cotação em várias mensagens
• Mensagens processadas em ordem aleatória
39. Paralelismo
É comum ocorrer operações simultâneas
• Salvar uma cotação duas vezes, por diferentes workers, ao mesmo tempo
Vários workers rodando em paralelo, em diferente máquinas
Adicionar índices de unicidade a nível de banco de dados
• Validação de ActiveRecord não é suficiente
40. Bugs
Como todo software, a integração tem defeitos
Lógica de negócios muitas vezes complexa
Dados inesperados / inconsistentes vindos do clássico
41. Bugs
Forte dependência entre os dados
• Cotação - Resposta - Negociação - Pedido
Erros em uma cotação, causa dezenas de outros erros
• Integrar os dados que faltam, mostrou-se ineficiente no passado
Criar uma ferramenta específica para migrar fornecedores
42. Integração x Migração
Integração
• Disponibilizar dados em tempo real para usuários de ambos os sistemas
Migração
• Sincronizar dados pendentes a fim de migrar um fornecedor específico
43. Estratégia da Migração
1. Buscar fornecedores 100% integrados (elegíveis)
1. Sincronizar fornecedores não elegíveis
2. Corrigir bugs da integração
60. Corrigir Bugs de Integração
Bugs impedem que fornecedores se tornem elegíveis
Priorização e correção dos bugs semanalmente
Colaboração com o time de suporte.
66. Conhecimento da Plataforma
Fluxos não considerados inicialmente na integração
Usuários integrados são sempre uma surpresa
Validações desnecessárias na integração
67. Tecnologias e Práticas
Ruby para sistemas de tempo real
Alteração de dados em produção
Configuração manual de tópicos e filas
70. Integração e Migração Separadas
Migração não influencia na performance da integração
Deploys independentes
• Execução de experimentos
Facilidade na análise de dados e erros
• Logs e Kibana
71. Conceitos de Lean Startup
Entregar valor com o mínimo de esforço
• Migração
Iterações curtas e aprender com os erros
• Deploys constantes
72. Aproximação de Tecnologia e
Operações
Entendimento do usuário pela área de tecnologia
Entendimento da tecnologia para área de operações
Criação da ferramenta de backoffice
73. Desafios na reescrita de uma
plataforma de +15 anos na
Bionexo
Fernando Kakimoto
@nandokakimoto
Notas do Editor
Custo da integração vs custo do regene
Se Continuar com a plataforma atual, iriamos ser ultrapassado pelos concorrentes do mercado no futuro
A diretoria entendeu que precisavamos evoluir tanto a empresa quanto suas soluções digitais
Tentou-se atualizar a plataforma corrente com o projeto Usabilidade, mas o projeto foi um fracasso
Então, tentamos criar uma plataforma do zero, com novas regras de negócio e mais genérica para atender todos os clientes
Fornecedores primeiro porque a plataforma dos hospitais é mais complexa;
Hospitais é um nicho de mercado que já alcançamos quase 100%
Menor complexidade mais maior oportunidade de mercado
Se Continuar com a plataforma atual, iriamos ser ultrapassado pelos concorrentes do mercado no futuro
A diretoria entendeu que precisavamos evoluir tanto a empresa quanto suas soluções digitais
Tentou-se atualizar a plataforma corrente com o projeto Usabilidade, mas o projeto foi um fracasso
Então, tentamos criar uma plataforma do zero, com novas regras de negócio e mais genérica para atender todos os clientes
Fornecedores primeiro porque a plataforma dos hospitais é mais complexa;
Hospitais é um nicho de mercado que já alcançamos quase 100%
Menor complexidade mais maior oportunidade de mercado
File Transfer (43)—One application writes a file that another later reads. The applications need to agree on the filename and location, the format of the file, the timing of when it will be written and read, and who will delete the file.
Shared Database (47)—Multiple applications share the same database schema, located in a single physical database. Because there is no duplicate data storage, no data has to be transferred from one application to the other.
Remote Procedure Invocation (50)—One application exposes some of its functionality so that it can be accessed remotely by other applications as a remote procedure. The communication occurs in real time and synchronously.
Messaging (53)—One application publishes a message to a common mes- sage channel. Other applications can read the message from the channel at a later time. The applications must agree on a channel as well as on the for- mat of the message. The communication is asynchronous.
The quick answer is that messaging is more immediate than File Transfer (43), better encapsulated than Shared Database (47), and more reliable than Remote Procedure Invocation (50)
Não depende de onde o serviço está localizado;
Não depende se o serviço está de pé no momento da requisição;
Não depende de uma interface específica;
Por exemplo, saber que o criação de pedidos acontece no fluxo de cotação em espera?
1: mensagem de criação
2: mensagem de atualização
3: mensagem de atualização
Em que cenários esse problema era comum?
Mensagem JSON de cotação.
- Numerar as bolinhas da cotação
O que mostrar ao usuário enquanto a cotação não foi totalmente integrada?
Vale a penas mostrar parte de uma cotação ao invés de não mostrar nada?
- Explicar em detalhes o que significa operações simultaneas
Alguns exemplos de defeitos / casos não esperados
Logica complexa de Importação de pedido vs pedidos de contrato – outro fluxo separado para pedidos de contrato
Pedido existe no regene mas nao existe no clássico
Buscamos mudar o modelo de dados pensando numa melhor arquitetura
- Se não corrigir os erros, pq um dado que não integrou anteriormente iria integrar depois?
Ter mais acesso aos problemas do usuário
Os usuários podiam ser atendidos mais facilmente
O tempo de migração ficou mais curto
A area de tecnologia tomou o controle da migração