Contato
Mecanismo de Busca Europeu B2B de Produtos Promocionais (European Sourcing)

Mecanismo de Busca Europeu B2B de Produtos Promocionais (European Sourcing)

Mecanismo de busca B2B que funciona como feira online para revendedores europeus de produtos promocionais - um precursor das marketplaces atuais.

2010 - 2016
~6 anos
Software Engineer depois Senior Software Engineer
European Sourcing Group
PHP 5.xSymfony 2/3MySQLElasticsearchAngularJSDoctrine ORMZend FrameworkMemcacheRabbitMQApacheProxmox VE

Linhas de codigo

~9.2M

PHP, JS, Twig, CSS, HTML

Tabelas no banco

97

MySQL (master-slave)

Sub-aplicacoes

15+

Ecossistema de microsservicos

Idiomas suportados

7

FR, EN, DE, ES, IT, NL, PT

Servidores dedicados

9

OVH Proxmox VE

Conectores de fornecedores

26+

Importacao automatizada de dados

Entradas de versionamento

1.234

836 Git + 398 SVN

Sites revendedores

~160

CMS hospedado MyEasyWeb

Apresentacao e definicao do projeto

Quinze sub-aplicacoes interconectadas, quatro geracoes de mecanismos de busca, 8 anos de desenvolvimento

European Sourcing e um mecanismo de busca B2B de produtos promocionais que funciona como feira profissional permanente online em escala europeia - um precursor do que hoje chamamos de marketplaces, destinado a todos os revendedores europeus de produtos promocionais. O projeto constitui um ecossistema completo de aplicacoes composto por quinze sub-aplicacoes interconectadas, desenvolvidas ao longo de mais de 6 anos (2010-2017).

A plataforma conecta tres tipos de atores no mercado de produtos promocionais:

  • Fornecedores (fabricantes/atacadistas) que listam seus catalogos de produtos → B2B
  • Revendedores/Distribuidores (agencias de comunicacao) que buscam produtos para seus clientes → B2B
  • Visitantes que navegam pelo catalogo online nos sites dos revendedores (clientes finais) → B2C

O sistema funciona como uma feira profissional permanente online, oferecendo aos fornecedores uma vitrine multicanal (catalogo online, newsletters, banners publicitarios, guidebook anual, Google Ads) e aos revendedores um motor de busca de produtos multilingue cobrindo 7 idiomas europeus.

Dominio de negocios

Comunicacao por objeto B2B - conectando fornecedores, revendedores e agencias europeias na industria de produtos promocionais.

Usuarios-alvo

Profissionais B2B em toda a Europa - agencias de comunicacao, distribuidores, e exemplos de fornecedores europeus integrados (Midocean, PF Concept, BIC, Paul Stricker, SOL'S, TopTex, Topico, Inspirion, Makito, Xindao, Clipper, Cybernecard, Pixika, Delta, Passot, Lm, Boomerang, Axpol, Goya, GetImpressed, Giving, Lensen Toppoint, Cottel, Eljte, Frezal, Imbretex).

Escopo funcional
Catalogo de produtos multilingue (7 idiomas)
Busca full-text (Elasticsearch)
Back-office fornecedores/revendedores
Importacao automatizada de dados (26+ conectores)
API REST com autenticacao WSSE
Sistema de traducao centralizado
Pagamento online (Sogenactif)
CMS mini-sites revendedores (MyEasyWeb)
Aplicacoes moveis (PhoneGap/Cordova)
Estatisticas de consulta (visualizacoes, buscas, cliques)
Exportacao de dados (CSV + imagens de produtos)
Back-office SEO / Marketing

Objetivos, contexto, desafios e riscos

Digitalizando o mercado europeu de produtos promocionais

Objetivos
  • Posicionar a plataforma como a referencia europeia do sourcing B2B de produtos promocionais online, substituindo catalogos impressos e feiras fisicas
  • Construir um catalogo de produtos multilingue agregando varios milhoes de produtos e variantes provenientes de dezenas de fornecedores
  • Fornecer aos revendedores um motor de busca avancado com filtros por categoria, marca, preco, atributos, marcacao
  • Automatizar a importacao de feeds de dados de fornecedores (precos, estoques, imagens, descricoes) de 26+ fornecedores
  • Oferecer aos revendedores uma solucao pronta de mini-sites e-commerce (MyEasyWeb) com sua propria vitrine brandada conectada ao catalogo central
  • Gerar estatisticas de consulta detalhadas para fornecedores (visualizacoes de produtos, buscas, cliques)
Contexto

O projeto inicial (v1/v2) foi desenvolvido pela SQLI, uma empresa francesa de servicos de TI, com um framework PHP customizado e templates Smarty. O codigo legado continha 398 revisoes SVN cobrindo 2010-2013.

Quando cheguei na SQLI, 5 desenvolvedores PHP dedicados em tempo integral trabalhavam no projeto. Com o tempo, assumi uma parte crescente do perimetro tecnico, ate cobrir sozinho o essencial das evolucoes - um papel que evoluiu naturalmente com minha expertise crescente e a autonomia do ambiente PME. Depois de cuidar sozinho do perimetro por um tempo, pedi reforco e obtive a contratacao de um segundo desenvolvedor.

A partir de 2014-2016, nossa nova equipe Medialeads realizou uma reescrita completa da plataforma, migrando progressivamente do framework customizado para Symfony 2/3 enquanto mantinha o site publico em um framework MVC customizado mais leve.

A plataforma era multilingue (7 idiomas), multi-pais, com alto volume de dados de produtos, e a necessidade de manter compatibilidade com os feeds de dados de fornecedores existentes - tudo hospedado em servidores dedicados OVH totalmente autogerenciados: faziamos absolutamente tudo por conta propria, da configuracao do sistema ate as implantacoes.

Desafios

Modelo de negocios

Receita de assinaturas de fornecedores (240-288 EUR/ano) e servicos publicitarios (banners, newsletters, guidebook, Google Ads, planejamento de midia).

Posicao estrategica

European Sourcing se posicionava como a referencia do sourcing de produtos promocionais online na Europa - um precursor das marketplaces B2B atuais, substituindo catalogos impressos e feiras fisicas tradicionais.

Ecossistema de marcas

A empresa tambem operava TendanceObjet.com, Kadobjet.fr, FranceObjet.com, Omyague.com, GourmetOnline.pro, Recherche-Publicitaire.com, GraphicSourcing.com, CPrint-Sourcing.com, WineSpiritSourcing.com, Tradexpo-Online.fr - cada marca visando um segmento especifico do mercado.

Riscos identificados

Divida tecnica

Migracao progressiva de um framework customizado para Symfony, coexistencia de duas arquiteturas (SVN legado + Git moderno), hash MD5 de senhas com uma unica iteracao e sem salt - coerente com o estado da arte das praticas de seguranca PHP da decada 2008-2014, antes de bcrypt se tornar o padrao.

Complexidade de integracao

Os feeds de dados de fornecedores eram heterogeneos (CSV, XML, API), exigindo um adaptador especifico por fornecedor, todos mantidos em flux.europeansourcing.com.

Dependencia de infraestrutura

9 servidores dedicados OVH com virtualizacao Proxmox, replicacao MySQL master/slave, implantacoes manuais via svn up - reflexo das restricoes tecnicas da epoca, antes da democratizacao do Docker e dos pipelines CI/CD modernos.

Bus factor

Apenas 3 desenvolvedores principais para todo o ecossistema de 38 sub-projetos e 9 servidores.

As etapas - O que eu fiz

Do monolito SQLI a arquitetura de microsservicos distribuida

Fase 1
Desenvolvimento SQLI e legado SVN (2008-2013)
2008 - 2013
  • Eu gerenciei o codigo legado herdado da SQLI - um monolito PHP com templates Smarty, sob versionamento SVN (398 revisoes)
  • No extranet de fornecedores e revendedores, assumi tanto a manutencao quanto as extensoes funcionais (CRUD de produtos, gestao de imagens, precos, atributos, marcacoes)
  • Em paralelo, conduzi as operacoes de implantacao em servidores dedicados e coordenei o trabalho com a documentacao SQLI (47+ documentos de especificacoes)
  • Para resolver os problemas de qualidade (categorias-pai ausentes, cores incorretas, imagens quebradas), desenvolvi scripts de correcao de dados dedicados
Fase 2
Retomada interna e microsservicos (2014-2016)
Jan 2016 - Dez 2016
  • Eu liderei a migracao de SVN para GitHub - 13 repositorios criados em janeiro 2016, organizacao medialeads com 8 membros e 20+ repos privados
  • Do lado do extranet, realizei a reescrita completa (177 commits) em um framework PHP MVC customizado com acesso direto ao banco MySQL
  • No backend, desenvolvi a API REST (api.europeansourcing.com) em Symfony 2.4 com Propel ORM e autenticacao WSSE
  • Para automatizar a importacao de dados dos fornecedores em flux.europeansourcing.com, construi conectores dedicados para Pixika, Makito, Midocean, BIC, Paul Stricker, TopTex e Cybernecard
  • No tema da busca full-text, migrei para o Elasticsearch com indices multilingues dedicados
  • Em paralelo, criei o sistema de traducao centralizado (translate.europeansourcing.com) em Symfony 3.0
Fase 3
Modernizacao arquitetural (2016-2017)
Mar 2016 - Nov 2016
  • Eu iniciei a reescrita arquitetural em torno de bundles Symfony compartilhados (ESCoreBundle: 143 commits, ESSourcingBundle: 15 commits)
  • Do lado da modelagem, projetei os comportamentos Doctrine: Sluggable, Sortable, Timestampable, Translatable, Blameable, Toggleable, Visible, Overloadable, Tree
  • Para absorver picos de carga, apoiei-me no RabbitMQ para introduzir o processamento assincrono na importacao de dados e nos calculos de visibilidade
  • No lado da infraestrutura, configurei o provisionamento com Chef para o projeto extranet_rebirth
Project Timeline
European Sourcing - 2008-2017
Supplier Data Import Flow

Os atores - As interacoes

Como colaborei em uma equipe reduzida mas altamente produtiva

Equipe de desenvolvimento

Dependendo do periodo, trabalhei com 3 a 5 desenvolvedores ativos, com responsabilidades claramente divididas:

José DA COSTA

Meu papel - desenvolvedor lider. Produzi 35,3% do versionamento total (225 Git + 116 SVN), com presenca dominante no extranet (177 commits), flux (15) e na gestao do legado SVN.

Thomas C.

Desenvolvedor senior com quem trabalhei no dia a dia - 36,9% (355 Git + 1 SVN). Dominante no ESCoreBundle (113), translate (88), supplierbo (19).

wamania

Desenvolvedor com quem compartilhei o codigo da plataforma - 24,2% (226 Git + 8 SVN). Dominante no europeansourcing.com (166 commits), extranet (49).

IronXtreme

Desenvolvedor que cruzei no perimetro do ESCoreBundle - 3,0% (29 commits Git).

Contribution Distribution (Git + SVN)
Partes interessadas externas com quem interagi

SQLI

Retomei e aproveitei os entregaveis desta empresa de servicos de TI que desenvolveu v1/v2/v3 (especificacoes, desenvolvimento inicial)

Dolead

No lado da aquisicao paga, colaborei com esta agencia para a gestao do Google AdWords

Universem

No SEO, apoiei-me nesta agencia para as auditorias TendanceObjet e Kadobjet

OVH

Para a hospedagem, pilotava seus 9 servidores dedicados no dia a dia

Os resultados

Impacto mensuravel para a empresa e para minha carreira

Para mim
  • Gestao massiva de dados e otimizacao SQL: afiei meu dominio das formas normais SQL (1NF, 2NF, 3NF, BCNF), de todos os tipos de joins (INNER/LEFT/RIGHT/CROSS/SELF) e da indexacao avancada (indices B-tree, compostos, covering), com analise constante de planos de execucao via `EXPLAIN ANALYZE`, apoiando-me na replicacao MySQL master-slave e no cache Memcache. Mantinha batches noturnos de varias horas rodando para recalcular estoques, precos e promocoes em todo o catalogo - nessa escala, um indice ausente podia transformar uma query de 50 ms em timeout de 30 segundos, entao cada milissegundo ganho por query se multiplicava em milhoes de execucoes.
  • Mecanismos de busca e indexacao: passei praticamente por quatro geracoes de mecanismos - (1) MySQL LIKE / FULLTEXT (MyISAM/InnoDB), (2) busca full-text PostgreSQL com `tsvector`/`tsquery`, indices GIN e funcoes `to_tsvector`/`ts_rank`, (3) Apache Solr, onde indexei centenas de milhares de produtos com facetamento avancado (categorias, cores, precos, fornecedores), sugestoes, correcao ortografica e scoring de relevancia personalizado, (4) Elasticsearch com inverted indexes, analyzers multilingues (stemming, tokenization, normalizacao), scoring TF-IDF, agregacoes e facetas. Essa trajetoria me permitiu captar em profundidade as diferencas entre um mecanismo relacional e um mecanismo de busca dedicado.
  • Algoritmos e regras de negocio complexas: concebi e implementei numerosos algoritmos e regras de negocio muito complexas - por exemplo o calculo de todas as combinacoes possiveis de preco, variantes de produto e disponibilidade (produto cartesiano / explosao combinatoria gerando milhares de combinacoes por produto entre tamanhos, cores, quantidades, tipos de marcacao, zonas de marcacao e acabamentos). A modelagem de regras de pricing dinamicas e motores de decisao de negocio agora faz parte da minha caixa de ferramentas.
  • Consolidei o dominio do ecossistema Symfony 2/3 em producao em larga escala (Propel, Doctrine, bundles, servicos, seguranca, WSSE).
  • Do lado da migracao de codigo legado, construi habilidades solidas conduzindo a transicao do monolito SVN para microsservicos Git sem interrupcao de servico.
  • No plano de negocio, adquiri um conhecimento profundo do mercado B2B de produtos promocionais, da automacao de feeds de dados e do e-commerce multi-pais.
  • Por fim, este projeto mudou minha forma de trabalhar: aprendi a me coordenar em uma equipe pequena onde cada desenvolvedor possui porcoes significativas do codigo, e a conduzir perimetros de ponta a ponta.
Para a empresa

Cobertura funcional

Ciclo completo de sourcing B2B coberto por um unico ecossistema - do upload de catalogo do fornecedor a vitrine do revendedor, sem rupturas manuais entre servicos

Volume do catalogo

Indexacao da maior base de dados europeia de produtos promocionais - varios milhoes de produtos e variantes agregados de 26+ feeds de fornecedores, armazenados em 97 tabelas MySQL com replicacao master-slave

Alcance multilingue

7 idiomas europeus com indices Elasticsearch dedicados e gestao centralizada de traducoes

Cobertura geografica

Sub-dominios localizados cobrindo os principais mercados europeus: UK, Iberia, Italia, Alemanha, mais um vertical Textil dedicado

Escala de automacao

26+ conectores automatizados de dados de fornecedores lidando com formatos heterogeneos (CSV, XML, API) de grandes marcas europeias

Rede de revendedores

~160 mini-sites revendedores hospedados na plataforma CMS MyEasyWeb

Ecossistema de marcas

11+ marcas operadas: europeansourcing.com, tendanceobjet.com, kadobjet.fr, franceobjet.com, omyague.com, gourmetonline.pro, recherche-publicitaire.com, graphicsourcing.com, cprint-sourcing.com, winespiritsourcing.com, tradexpo-online.fr

Funcionalidades-chave entregues

Catalogo de produtos multilingue com indices Elasticsearch dedicados e scoring de relevancia personalizado
API REST com autenticacao WSSE stateless (nonce + timestamp + digest)
Conectores automatizados de importacao lidando com feeds heterogeneos CSV / XML / API
Back-office fornecedores/revendedores com gestao completa de produtos
Dashboard de fornecedores SPA (AngularJS 1.2 + CoffeeScript + Grunt + Bower)
CMS mini-sites revendedores (MyEasyWeb) com vitrines brandadas conectadas ao catalogo central
Integracao de pagamento online (Sogenactif, Société Générale)
Back-office SEO / marketing (Zend Framework + ExtJS + crawler web)
Aplicacoes moveis hibridas (jQuery Mobile + PhoneGap/Cordova)
Microservices Ecosystem
Technology Distribution
Escala do codigo
7.514Arquivos PHP
4.505Arquivos JS
909Controllers
2.222Views / templates
87Cron jobs
1.506Arquivos i18n
611Arquivos de teste

O depois do projeto

O que aconteceu apos minha saida do projeto

Sai do projeto em novembro de 2016, deixando uma plataforma em pleno funcionamento. A equipe continuou operando e evoluindo o European Sourcing - o projeto nao foi interrompido, ele simplesmente continuou sem mim. A fase final de consolidacao em torno de bundles Symfony compartilhados, que eu havia iniciado, foi levada adiante pela equipe.

Em retrospectiva, as escolhas arquiteturais da Fase 2 se mostraram solidas e modernas para sua epoca: a abordagem orientada a servicos com subdominios dedicados, a autenticacao WSSE stateless entre servicos, a arquitetura do mecanismo de busca e a infraestrutura de conectores automatizados de fornecedores permaneceram tecnicamente impressionantes muito depois da minha saida.

Minha perspectiva critica

Como julgo este projeto, com o recuo de 8 anos de desenvolvimento

Pontos fortes
  • Arquitetura de microsservicos bem projetada

    Com o recuo, considero que a decomposicao do monolito SQLI em servicos especializados (API, busca, flux, traducao, exportacao, estatisticas) demonstra uma visao arquitetural solida. Cada servico que recortamos tem responsabilidade clara e perimetro funcional bem definido.

  • Escopo de produto raro no mercado

    Na epoca, muito poucos concorrentes ofereciam todo o ciclo de sourcing B2B em um unico ecossistema. Continuo convencido de que esse nivel de integracao, que levamos longe, foi o que posicionou a European Sourcing na lideranca do mercado europeu.

  • Internacionalizacao nativa

    Reivindico a escolha dos indices Elasticsearch dedicados por idioma e do sistema de traducao centralizado: pensamos a ambicao europeia desde o inicio, em vez de adiciona-la depois.

  • Automacao de importacao de fornecedores

    Com o tempo, mensuro o valor dos conectores que construi para lidar com formatos heterogeneos (CSV, XML, API) - um investimento tecnico consideravel e valor de negocio fundamental que formaram uma vantagem competitiva real.

Areas para melhoria
  • Implantacao pre-CI/CD

    Eu implantava apenas manualmente via svn up, sem pipeline de integracao continua e sem testes automatizados. Era coerente com as praticas do ecossistema PHP da decada 2008-2014 (GitHub Actions ainda nao existia, Jenkins e Travis CI engatinhavam), mas identifico isso claramente como uma limitacao hoje.

  • Versionamento pre-SemVer

    Nao posicionei nenhuma tag Git nos 13 repositorios - reflexo da epoca, antes da adocao massiva de SemVer no ecossistema PHP e da popularizacao do GitHub Releases. Com o recuo, lamento.

  • Ecossistema multi-frameworks

    Tive que lidar com a coexistencia de multiplos frameworks (PHP customizado, Symfony 2.4, 2.8, 3.0, 3.1, Zend Framework 1) e 2 ORMs (Propel, Doctrine) - consequencia de uma migracao progressiva ao longo de varios anos, coerente com a evolucao do ecossistema PHP entre 2010 e 2016, mas pesada de manter.

O que eu faria diferente

Com os padroes e o recuo de hoje, eis as escolhas que eu refaria diferente - cada decisao fazia sentido dentro das restricoes da sua epoca:

  • Adotar um unico framework desde o inicio em vez de manter um framework PHP customizado ao lado do Symfony, embora o contexto historico justificasse a coexistencia durante a migracao.
  • Configurar CI/CD desde a migracao para GitHub (janeiro 2016) - Jenkins, Travis CI ou GitLab CI estavam disponiveis mesmo que GitHub Actions ainda nao existisse.
  • Usar Docker para ambientes de dev e implantacao, embora Proxmox fosse o padrao de virtualizacao maduro para PMEs PHP da epoca.
  • Centralizar o acesso a dados via uma unica API em vez de conectar cada servico diretamente ao banco MySQL - um padrao que so se generalizou apos 2017.
Os ensinamentos duradouros que este projeto me trouxe

A migracao de legado e uma maratona

A transicao do monolito SQLI para a arquitetura de microsservicos me tomou mais de 3 anos e permanecia em andamento quando sai do projeto. Saio com a conviccao de que e preciso planejar marcos realistas e aceitar compromissos temporarios.

A automacao de importacao de dados e critica

Mensuro o quanto os conectores de fornecedores que construi representam valor de negocio consideravel mas tambem divida de manutencao permanente - qualquer fornecedor pode mudar seu formato a qualquer momento, e cada quebra se transforma em incidente de producao.

A internacionalizacao deve ser planejada desde o inicio

Vivi na pratica como o sistema de traducao centralizado e um excelente padrao. Adicionar suporte multilingue depois teria me custado exponencialmente mais do que planeja-lo desde o inicio.

A documentacao de consultoria e preciosa

Anos apos o fim da prestacao, ainda podia me apoiar nas especificacoes da SQLI para entender a arquitetura. Levo como aprendizado que investir em documentacao tecnica tem um ROI de longo prazo.

Arquitetura tecnica

Architectural Évolution - Monolith to Microservices

Trajetória relacionada

Experiência profissional ligada a está realização

Competências aplicadas

Competências técnicas e humanas aplicadas

Competências técnicas

Arquitetura & Design5/5

Arquitetura de Software & Sistemas

Decomposição do monólito SQLI em ecossistema de microsserviços (API, search, flux, translate, export, stats, supplierbo) com bundles Symfony compartilhados (ESCoreBundle, ESSourcingBundle) e autenticação WSSE stateless inter-serviços, API REST JSON em Symfony 2.4 + Propel com autenticação WSSE stateless (nonce + timestamp + digest), JMS Serializer, CORS e conexões multi-banco (europeansourcing + tendanceobjet). Microsserviços, MVC, SPA (AngularJS), pattern Strategy para 26+ conectores de fornecedores heterogêneos (CSV/XML/API) e behaviors Doctrine (Sluggable, Sortable, Timestampable, Translatable, Blameable)

Desenvolvimento de software5/5

Desenvolvimento Fullstack

15+ sub-aplicações interconectadas em PHP MVC custom, Symfony 2/3, AngularJS SPA, jQuery Mobile e apps PhoneGap/Cordova ao longo de 8 anos

DevOps & Cloud4/5

DevOps, Cloud & Industrializacao de Produção

Liderança da migração de SVN (398 revisões) para GitHub (13 repositórios, 836 commits) - configuração da organização, estratégia de branches por desenvolvedor, 20+ repositórios privados sob a organização medialeads

Dados & IA4/5

Dados, IA & Machine Learning

Projeto e otimização de schema MySQL com 97 tabelas e replicação master-slave - formas normais SQL (1NF/2NF/3NF/BCNF), indexação avançada (B-tree, composite, covering), análise contínua de planos EXPLAIN e evolução para PostgreSQL full-text (tsvector/GIN) e Elasticsearch

Arquitetura & Design4/5

Engenharia Reversa & Algoritmos

Algoritmos de pricing combinatório (produto cartesiano gerando milhares de combinações por produto: tamanhos × cores × quantidades × tipos de marcação × zonas de marcação × acabamentos) e teoria de indexação de motor de busca (índice invertido, analisadores, scoring TF-IDF)

Galeria de imagens

Capturas e visuais do projeto

Voce tem um portal B2B multilingue para projetar ?

Entreguei o portal European Sourcing ponta a ponta: modelagem de produto multilingue, catalogo de sourcing e fluxos de compradores. Vamos conversar sobre seu contexto.

Entrar em contato