/* Precisamos transferir dados de uma fonte para um consumidor. A fonte fornece os dados em pequenos lotes (~dez registos), enquanto que o consumidor funciona melhor com lotes maiores (~mil registos). Um exemplo real é a transferência de dados de filas tipo Kafka para uma base de dados Clickhouse. Fonte: - Praticamente infinita. - A fonte nunca devolve mais de MaxItems registos numa chamada a Next. - Dentro de uma "sessão" (uma chamada à função Pipe), a fonte devolve dados novos em cada chamada a Next. - No entanto, após reiniciar, a fonte começa na posição "confirmada" anterior, indicada por cookie. Portanto, *cada* valor de cookie devolvido por Next, após guardar os dados no receptor, deve ser confirmado com a chamada a Commit, na mesma ordem em que foram devolvidos por Next. Receptor: - Não pode processar mais de MaxItems de cada vez. Nível básico: É necessário implementar a função func Pipe(p Producer, c Consumer) error que lê dados da fonte, os agrupa num buffer de tamanho não superior a MaxItems e os guarda no receptor, depois de o fazer, confirma o progresso na fonte. Dificuldade adicional: Os métodos Next, Process e Commit estão relacionados com chamadas de rede e podem demorar bastante. Para acelerar o processo, é necessário paralelizar os processos de leitura, escrita e confirmação de progresso. De modo que, durante Process ou Commit, a leitura da fonte e a formação do novo buffer continuem. */ const MaxItems = 9999 type Producer interface { // Next devolve: // - um lote de itens para processar // - uma cookie para confirmar quando o processamento estiver concluído // - um erro Next() (items []any, cookie int, err error) // Commit é usado para marcar um lote de dados como processado Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { // TODO }
Golang
Explica o princípio da inversão de dependências e por que a chamada direta aos métodos do repositório a partir de um caso de uso viola o SOLID.
Como você realizou o teste e a verificação da correção das solicitações realizadas?
Há algum prazo?
Dada uma função que aceita duas sequências ordenadas de números inteiros em ordem não decrescente. É necessário retornar todos os elementos da primeira sequência que não estão na segunda. Como você abordaria a solução e qual é a complexidade?
Como é que o JWT verifica a sua autenticidade? Como é que se garante que o token não foi falsificado?
/* Existe uma aplicação com arquitetura de microserviços. Um microserviço pode ser abstraído através de uma interface Backend. Para aceder a uma instância do microserviço, pode usar o tipo BackendImpl, que já está implementado. Cada microserviço tem várias dezenas de instâncias em execução, cada uma acessível pelo seu próprio endereço addr. No entanto, as instâncias individuais do microserviço não são confiáveis: podem falhar, estar inacessíveis ou sobrecarregadas. Por isso, precisa implementar o tipo Balancer, que também implementa a interface Backend e realiza balanceamento de carga do lado do cliente entre as instâncias do microserviço, escolhendo a cada vez a instância **menos carregada**. */ type Request interface{} type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr contém ip:porta de uma instância específica func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO } var _ Backend = &Balancer{} // addrs contêm os endereços de todas as instâncias balanceadas func NewBalancer(addrs []string) *Balancer { // TODO }
Quais são as diferenças entre os ambientes local, dev, stage, prod?
Tem experiência em gestão de equipas?
O que é adicionado à resposta quando a janela se torna válida?
Qual é a limitação de um semáforo e de um canal com buffer como soluções para limitar solicitações paralelas?
/* Existe uma aplicação com arquitetura de microserviços. Um microserviço pode ser abstraído através de uma interface Backend. Para aceder a uma instância do microserviço, pode usar o tipo BackendImpl, que já está implementado. Cada microserviço tem várias dezenas de instâncias em execução, cada uma acessível pelo seu próprio endereço addr. No entanto, as instâncias individuais do microserviço não são confiáveis: podem falhar, estar inacessíveis ou sobrecarregadas. Por isso, precisa de implementar um tipo Balancer, que também implementa a interface Backend e realiza balanceamento de carga do lado do cliente entre as instâncias do microserviço, escolhendo sempre a instância **menos carregada**. */
Qual é o número máximo de solicitações por segundo (RPS) que o serviço mais carregado processou?
Formato de trabalho: remoto, no escritório ou híbrido?
O que é um token JWT? Do que é composto?
Escrever uma questão na linguagem Go — secção prática (problemas do dia a dia do desenvolvedor, sem algoritmos): melhorar ou corrigir um serviço. Duração — 1,5 horas.
Como tornar a memória constante (eliminar a dependência do número de caracteres únicos)?
Como será a interação entre o cliente, o microserviço de autorização e o microserviço da loja ao usar JWT? E o que mudará sem JWT, com sessões?
Fala sobre a tua experiência de trabalho e o que estás a fazer.