Como preparar a entrevista para design de sistema | Programming Made Easy | Skillshare

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Como preparar a entrevista para design de sistema

teacher avatar Programming Made Easy, Software Developer

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Boas-vindas a este curso!

      1:35

    • 2.

      O que é design de sistemas

      5:33

    • 3.

      Um modelo para qualquer pergunta

      7:12

    • 4.

      O serviço de encurtamento de URL

      24:22

    • 5.

      O aplicativo de compartilhamento de fotos

      19:02

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

83

Estudantes

--

Sobre este curso

Hoje em dia, quase todas as empresas pedem para o design de vários sistemas em suas entrevistas de design de Sistema. Principalmente o projeto do sistema é para pessoas experientes, mas empresas líderes como as da FANG e assim por diante, estão interessadas em pedir aos projetos para até mesmo frescos. Há uma dedicado uma a duas horas para design de sistema. A rodada de design do sistema tem vários propósitos, o entrevistador quer conhecer sua amplitude de conhecimento, eles querem entender como você aborda um problema aberto e como lidar com situações estressantes.

Design de sistema também é conhecido como design de alto nível. Design de alto nível não é mais que decidir quais componentes vamos precisar em nosso sistema, como todos os componentes vão se comunicar e sistemas externos e qual a capacidade do nosso sistema. São coisas importantes ao projetar qualquer sistema para torná-lo confiável, disponível, consistente e eficiente.

Este curso é projetado de forma incremental, para fins de compreensão. Inicialmente, todos os conceitos e componentes do design do sistema são discutidos. Um procedimento passo a passo prova completa é explicado para lidar com qualquer problema de design do sistema. Todos os estudos de caso são dados de forma abrangente e são projetados seguindo estes passos.

Conheça seu professor

Teacher Profile Image

Programming Made Easy

Software Developer

Professor

Habilidades relacionadas

Design Mais design Design cênico
Level: All Levels

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. Boas-vindas a este curso!: Olá pessoal e bem-vindos a este curso sobre a preparação para a entrevista de design do sistema. Meu nome é Alex e sou engenheiro de software, o teste que está sendo feito e também dando entrevistas de System Design durante meu tempo em empresas de software. Quando ouvi falar da possibilidade de criar um curso para explicar mais sobre essas entrevistas complexas, o tipo II estava bastante ansioso para desenvolver um. Esta aula será estruturada em quatro lições que contêm etapas práticas para você tomar para entender exatamente o que os entrevistadores esperarão ao agendar esses tipos de entrevista que você irá evoluir primeiro, apresentar a você qual é o design do sistema. E então veremos o modelo que funciona quando se trata de resolver qualquer pergunta de entrevista de design do sistema. Depois disso, também resolveremos duas das perguntas de entrevista mais comuns desse campo, projetando um novo URL, reduzindo o serviço e o sistema de compartilhamento de fotos. Se você estiver interessado em melhorar suas habilidades de entrevista com engenheiro de software, considere este curso para você. Não há outros requisitos, em seguida, uma conexão com a Internet S para o projeto desta classe, será extremamente prático e envolverá você a seguir as etapas apresentadas no modelo do curso. Assim, você pode começar sua jornada de resolver questões de entrevista de design do sistema. Pensamos no dito, acho que estamos prontos. Vejo você na primeira lição. 2. O que é design de sistemas?: Olá pessoal e bem-vindos de volta ao sistema. Você contou a ele um tutorial entrevistado. Nesta palestra, vamos discutir o que exatamente é o design do sistema, o que é suposto ser uma entrevista de design de sistema. Também vamos dar uma olhada em algumas boas práticas gerais quando se trata de sua própria entrevista de design de sistema. Você pode estar colocando-os para uma posição em que você está tentando conseguir um emprego para uma empresa de engenharia de software. E você ouviu os dois, eu vou ter uma entrevista de design de sistema junto com as entrevistas mais orientadas técnicas onde você realmente deveria revestir. Bem, em geral, em entrevistas de design do sistema, você não tem permissão para revestir. Talvez apenas um pouco para provar seus pontos em algumas partes. Agora, começar com a definição do que exatamente o sistema projetou a facilidade. É apenas o processo de definir diferentes módulos, interfaces, componentes e também os dados de um sistema para atender aos requisitos especificados que podem ser especificados em sua pergunta que você obtém um mais recente na entrevista. Agora, o processo de desenvolvimento do sistema é na verdade, o processo que você vai fazer no seu trabalho. Se você conseguir a posição de desenvolvedor, onde você realmente criará ou alterou o sistema. Junto com os processos, modelos, metodologias e também práticas que são usadas para desenvolvê-los. Mas, por enquanto, o design do sistema é apenas o processo de definição dos componentes. Então, basicamente, está falando sobre o que seria necessário ao tentar pensar em desenvolver um projeto do zero. Chegando à entrevista à parte esta entrevista de design do sistema que, novamente, você pode ter conduzido com o único propósito de permitir os candidatos que estão tomando. Como talvez programadores, mas também podem ser engenheiros ou designers. A oportunidade de provar sua experiência no campo ao qual eles estão se candidatando. A aplicação tangível do conhecimento na solução de um problema real que a empresa pode estar enfrentando. Então, esses são novamente, problemas muito grandes e gerais também. Então você será solicitado a implementar algo como um bate-papo do WhatsApp ou algo assim. teremos exemplos Também teremos exemplos concretos mais adiante neste curso. Mas, novamente, eles são grandes problemas e você precisa falar sobre eles e pensar como você os implementaria de forma otimizada do ponto de vista da complexidade do tempo e do espaço. Agora, essa entrevista de design do sistema também é realizada posteriormente no processo de entrevista. Primeiro de tudo, você pode estar recebendo uma entrevista técnica onde você é realmente solicitado a codificar um problema real. E, mais tarde, no processo de entrevista, apenas para DC, você tem conhecimento prévio de alguns tópicos e também é capaz de ver as coisas de uma perspectiva maior. Eles também vão lhe dar a entrevista de design do sistema. Agora, este teste pretendia que seja ver o quão bem você trabalha em uma equipe. E também você está se aproximando de uma solução de problemas usando perguntas que são, como mencionei anteriormente, abertas. E você só precisa chegar à melhor solução possível. Esta entrevista deve analisar seu processamento, resolver os problemas, seu processo de pensamento na criação e também projetar os sistemas para ajudar eventuais clientes que firmam que você deseja entrar necessidades. Também é uma oportunidade para você mostrar ao pessoal de contratação, seja o gerente ou outros desenvolvedores quais você está fazendo essa entrevista. Os dois são valiosos para o membro, exibindo suas habilidades dessa maneira. Quando se trata de perguntas de entrevista e respostas no design do sistema, elas geralmente são muito ambíguas. E isso é apenas para permitir a oportunidade de demonstrar suas qualificações. Mas você não precisa se apressar em dar uma resposta que possa estar errada ou nem mesmo errada, mas não suficientemente documentada. Você também se reúne para fazer perguntas antes responder à pergunta deles apenas para restringir o escopo. Dê uma direção a você para esclarecer também as explicações. Isso foi sobre isso para uma apresentação geral de uma entrevista de design do sistema. Na próxima palestra, vamos discutir um pouco como podemos abordar todas as questões de entrevista de design do sistema. Há um processo de quatro etapas que foi documentado para estar funcionando, circulando para dar uma olhada nisso também. Mas, por enquanto, muito obrigado por ficar comigo até o final desta palestra. E estou ansioso para ver vocês no próximo. 3. O modelo para qualquer pergunta: Olá pessoal e bem-vindos de volta ao tutorial de entrevista de design do sistema. Nesta palestra, vamos dar uma olhada em alguns passos que podemos usar em um modelo quando recebermos uma pergunta de design do sistema em uma entrevista. Este temporário o tempo prestes a falar é um tamanho único para todos os tipos de modelo quando se trata de perguntas de entrevista de design do sistema, há apenas alguns passos que você precisa para garantir que você passa ao responder à pergunta da entrevista de design do sistema. Então, começando com esse modelo, a primeira coisa que você precisa ser compartilhado ao fazer a pergunta é que você o entende completamente. Então, precisamos entender esse problema. Eles precisam que você resolva e estabeleça o escopo do design sobre o qual você vai falar. Esta é a parte em que você precisa fazer perguntas logo após t fornecer os detalhes completos sobre as perguntas. E você também precisará estabelecer quaisquer restrições que possam aparecer. Você não precisa se apressar em tentar resolver o problema antes de ter todos os fatos e ter outras coisas que podem não estar claras para você esclarecidas pelo entrevistador. O próximo passo seria propor um design de alto nível. Eu digo que você não precisa entrar na implementação sem confirmá-lo. A abordagem em que você está pensando é realmente satisfazer todas as restrições que eles querem. Portanto, você pode propor uma abordagem que você acha que é a melhor para resolver o problema de design do sistema. Veja como eles reagem à sua abordagem antes de entrar na implementação de fato onde até mesmo entrando em detalhes em cada parte da sua proposta. Agora, a terceira parte é realmente feita mais demorada do modo, que é o design Deep Dive. Isso acontece depois que você validou com seu entrevistador que você está no caminho certo, você sabe neste momento, você só precisa entrar em todos os detalhes do aplicativo resolvendo que você inventou. E esta é a parte em que você precisa ter profundo entendimento e vocabulário do design de sistemas. E neste projeto de mergulho profundo, há muitos passos novamente e começam a mergulhar fundo. A primeira pergunta que você precisa fazer são os requisitos. E os requisitos podem ser funcionais ou não funcionais. Os requisitos funcionais são apenas funcionalidades que o problema que você está resolvendo está fornecendo aos usuários. Por exemplo, em suas mídias sociais, há uma funcionalidade que você pode gostar de uma postagem de qualquer outro usuário. Esse é um requisito que é funcional. Você precisa estabelecer e percorrer todos os requisitos funcionais com seus entrevistadores por curso, listá-los e validar sua importância. Agora, os requisitos também podem ser não funcionais, e aqui podem estar algumas coisas como a latência, que é o tempo de resposta da interação do usuário. Confiabilidade, o que significa que não haverá perda de dados. A consistência, o que significa alta disponibilidade. Agora, duas coisas que você também precisa ter em mente ao tentar projetar seus componentes. Você precisa fazê-los. Em primeiro lugar, tolerante a falhas, o que significa que seu sistema está funcionando em todos os momentos, mesmo que possa haver alguns erros ou algum risco de banco de dados. E eles também precisam ser doenças escaláveis. Outro fato importante, escalável significa apenas que você precisa lidar com a crescente quantidade de tráfego em seu sistema. Indo. Além disso, para a segunda parte deste projeto Deep Dive. Além dos requisitos, você também precisa fazer uma estimativa de armazenamento com base na modalidade de dados, você precisa apenas fornecer uma estimativa aproximada da quantidade de dados que devem ser armazenados. Além disso, você precisa pensar sobre o número de solicitações, o serviço que você fornece e a taxa de leitura. Depois de falar sobre todas essas estimativas de armazenamento, você precisa pensar em um design de banco de dados. Aqui, as ações que você é usuário pode executar para interagir com seu sistema estão ocorrendo. Você também pode pensar aqui sobre qual tipo de banco de dados você usará e também por que você pode ir para SQL, NoSQL e assim por diante. Você só precisa discutir sobre cada opção e pensar em qual delas se encaixa melhor na sua solução. Em seguida, uma quarta etapa seria iniciar o design básico de alto nível, onde você pode escrever sobre os clientes, os servidores e também o banco de dados. E a partir desse projeto básico, você também pode obter mais detalhes e isolar os serviços, particionar os dados falados sobre cache e também a replicação dos serviços e bancos de dados, até mesmo balanceamento de carga e filas de mensagens. Se isso se adequar ao seu problema específico. É claro que existem opcionais sobre algumas outras coisas que você pode pensar, dependendo exatamente do problema que você recebe, que pode ser a criptografia de algumas mensagens ou senhas. Alguma telemetria que garante que você acompanhe as coisas que mais se usam em seu aplicativo. Detecção de serviços de gateway de API e também d serviço de análise que analisa as solicitações e o beta do usuário. E depois deste projeto de mergulho profundo, o último passo, você precisa dar isso para apenas terminar, que significa que, com o projeto dado, para construir. Se parecer sensato, você pode pensar em identificar alguns gargalos e áreas de melhoria e falar um pouco sobre eles. Essa é a estrutura geral que você precisa ter em mente antes iniciar sua entrevista de design do sistema sem sequer receber o problema. Em algumas palestras futuras, vamos dar uma olhada em perguntas específicas da entrevista de design do sistema como projetar o pequeno sistema de URL, mecanismos de busca, unidades compartilhadas e assim por diante você celular posso ver como eu aplico todas essas etapas a partir desse modelo exato, minha abordagem ao resolver problemas de DC. Se isso soa interessante para você, estou ansioso para vê-lo nas próximas palestras. Muito obrigado por ficar comigo até o final deste. 4. O serviço de encurtamento de URL: Olá pessoal e bem-vindos de volta ao tutorial de entrevista de design do sistema. Nesta palestra, vamos discutir o famoso problema que muitas vezes é dado nesses tipos de entrevistas. E, mais especificamente, o projeto de um novo serviço de encurtamento de URL. Assim como por exemplo, você pode ter visto um pequeno URL ponto L e assim por diante. Nesta palestra, vou analisar todos os aspectos que você precisa considerar ao usar este tópico em uma entrevista de design de sistema. E depois de assistir a esta palestra, você saberá como seguir essa pergunta. Mas não só isso, você também saberia como você pode abordar estudos de problemas semelhantes. Porque ao resolver esse problema, também respeitaremos o modelo que devemos usar em qualquer pergunta de design de entrevista do sistema que nos seja dada. Começando com esse problema de entrevista, precisamos projetar, como eu disse, um serviço de encurtamento de URL, como URL minúsculo. E esta superfície fornecerá, é claro, lise curta, direcionamento vermelho URLs muito longos. Agora, a dificuldade da entrevista de design do sistema é bastante básica e muitas vezes é a mais dada na entrevista de design do sistema. Portanto, é muito importante que você saiba como resolver esse problema. A primeira coisa que precisamos discutir é por que precisamos encurtar o URL? Aqui estão vários motivos e por que precisaríamos disso. Em primeiro lugar, eles economizam muito espaço quando exibidos, preveem mensagens e assim por diante. E também se você quiser digitá-los do seu próprio teclado, você está menos propenso a cometer erros ao digitá-los. Ele também é usado para otimizar os links entre dispositivos e medir o desempenho em anúncios. A segunda coisa que precisamos abordar são os requisitos e as metas do nosso sistema que precisamos projetar. Quando dada essa pergunta, lembro aqui que quando você está em uma pergunta de entrevista de design do sistema, bem como outros tipos de entrevistas. E você está sendo questionado. Você precisa esclarecer todos os requisitos no início. Antes de tentar responder ao seu problema. Você precisa fazer a pergunta chamada para encontrar o escopo exato do sistema que você é entrevistador tem em mente, indo para as funcionalidades que essa pequena superfície de URL deve fornecer aos usuários finais de serviço. Nós os dividimos nas duas principais categorias de requisitos, que são funcionais e não funcionais. Ao pensar sobre os requisitos funcionais, podemos pensar em dar um URL ao nosso serviço e poder gerar de volta um menor e único. E isso é chamado de link curto. Esse link que nosso serviço fornece também deve ser curto o suficiente para ser facilmente copiado e colá-lo. E vamos discutir mais tarde o que significa curto o suficiente e também concordamos com esse termo. Agora, o segundo requisito funcional pode ser que o usuário possa escolher um personalizado em breve para suas URLs. Então, se eles não querem um gerado aleatoriamente pela nossa superfície, eles também devem ser capazes de escolher um deles. Esses links que nossa superfície fornece também devem ter um intervalo de tempo após a morte. Eles devem ser excluídos e também expiram. Porque, de outra forma, nosso banco de dados transbordaria em algum momento se você continuar tendo esses links nele. Por fim, os usuários acessam um link curto devem naturalmente, ler direcionado para o link original que o link curto representa. Há também alguns requisitos não funcionais para o serviço de encurtamento de URL, que seria que a direção vermelha deveria acontecer em tempo real sem latência alguma. Porque imagine que você gostaria de clicar em um link L-Y de ponto e levará uma eternidade para carregar. Você era um link real que deseja acessar que não seria bom. E também irritante. Além disso, outros requisitos não funcionais seriam que o link encurtado fornecido não deve ser adivinhável ou previsível por um usuário eventual malicioso. Os últimos e mais importantes requisitos não funcionais. Seria que nosso sistema, nosso serviço deve estar altamente disponível. Porque se estivesse inativo, todo o redirecionamento de URL é que ele conduziria seria, claro, com ele. Alguns requisitos adicionais aqui não podem ser que nosso serviço esteja acessível às APIs. Assim, terceiros podem fazer uma solicitação real para nossos endpoints e obter o URL encurtado como resposta se a solicitação estiver correta. Também algumas análises que poderemos fazer com esse limoeiro. E eles devem se preocupar com quantas vezes a Ressurreição aconteceu e também Quanto mais frequentemente onde a direção se liga, acesso e coisas assim. Depois de discutirmos todos esses requisitos e custos do sistema, podemos passar para o terceiro, que é a estimativa da capacidade que o serviço deve ter e também a restrição de vencer. Então, quando pensarmos sobre o serviço que implementaremos, é claro que ele será lido pesado. Isso ocorre porque muitas solicitações de direção vermelha em comparação com o novo encurtamento de URL estarão disponíveis. E podemos assumir aproximadamente 90 para uma proporção entre leitura e gravação. Porque se você pensar sobre isso, você só gera o link uma vez, mas é claro que seria lido muito mais de uma vez. Agora, as estimativas de tráfego para o serviço, podemos supor que teremos acima 100 ou 500 milhões de novos encurtamentos de URL por mês criados. Então 500 milhões de URLS talvez sejam serviços de torre. Com nossa porcentagem de readwrite, podemos esperar cerca de 50 bilhões de ereções vermelhas durante este mês. Também podemos pensar em consultas por segundo para o nosso sistema apenas para impedir que nosso banco de dados seja visto de falhar. Mas, além disso, também precisamos analisar as estimativas de armazenamento. Aqui podemos novamente fazer estimativas. Suponha que armazenemos todas as solicitações de encurtamento de URL por cinco anos. Como temos 500 milhões de novos URLs e objetos B e D que esperamos armazenar serão cerca de 30 bilhões. E assumindo que eles levaram cerca de 400 a 500 bytes cada, precisaremos de aproximadamente 15 terabytes para armazenar todos os nossos dados. Também precisamos pensar nas estimativas de largura de banda, não apenas na estimativa de armazenamento correta, podemos esperar cerca de 200 a 300 novas URLs a cada segundo. E isso é, claro, um top. Vamos olhar para o topo dessa gama. Portanto, o total de dados recebidos para o nosso serviço seria cerca de 500 bytes por solicitação vezes dois ou 300 novos URLs e B segundo, portanto, cerca de 100 a 200 kilobytes por segundo. Uma solicitação de leitura. Já que a cada segundo esperamos cerca de 20 a 30 mil URL já direções, o total de dados de saída será de cerca de dez megabytes por segundo. Também podemos analisar alguma estimativa de memória. E se quisermos pegar alguns dos nossos URLs curtos mais usados que são muito SH disse x. Bem, podemos olhar um pouco para a regra 8020. Isso está dizendo que os 20% dos nossos URLs gerarão 80% do tráfego. Portanto, 20% dos nossos URLs curtos gerados serão os mais quentes. E no curto olhar, podemos ver que, se tivermos 20 a 30 mil solicitações por segundo, obteremos cerca de 1,7 a 8 bilhões de solicitações por dia. Para capturar 20% desses, vamos precisar de aproximadamente 170 gigabytes de memória. Como você viu na minha abordagem, a parte da estimativa de capacidade e restrições precisam ser muito simples, pensando no limite e estimar quanta capacidade real e largura de banda ele vai ser tomado pela superfície implementada. Eu disse que também podemos ver algumas APIs e discutir essa parte. Podemos disponibilizar alguns endpoints que nosso serviço fornecerá a terceiros que queriam acessar nossa exibição de serviço, fazer solicitações aos nossos endpoints e voltar como um responda ao URL encurtado. Por exemplo, podemos ter um endpoint que o leste chamou de criar o URL. E ele pode usar o URL original como um parâmetro de string, que é claro o URL original que você deseja ter encurtado. E também algum tipo de chave associada à chave do desenvolvedor da API de uma conta. Então, sabemos quem está fazendo essas solicitações e temos algum tipo de segurança nessas partes. Como eu disse antes, esse endpoint, é claro que retornaríamos a inserção bem-sucedida. É claro que retornaria uma string com o URL encurtado se a solicitação for feita. Bem, e se não, talvez um código de erro, também podemos ter um endpoint de URL de exclusão. O que isso é importante, você também pode mencioná-lo de qualquer forma. Também precisamos pensar em como evitar abusos aqui. Se expormos uma API porque um usuário mal-intencionado poderia colocá-lo fora do negócio e destruir seus serviços se ele colocar algum URL de oliva t é o design atual e preencher seu banco de dados. Podemos impor aqui algum limite à chave do desenvolvedor da API. Ele pode ser limitado a um certo número de criações de URL que dizem dez ou 20 dias ou algo assim. Agora, o próximo passo seria pensar sobre o design e o esquema do banco de dados. Definir o esquema nos estágios iniciais da entrevista realmente ajudaria você a entender o fluxo entre os componentes, guiaria você para o particionamento posterior dos dados. Agora, algumas observações aqui seriam que precisamos armazenar para os serviços bilhões de registros. Vamos ter muitos URL encurtados. Mas esses objetos serão muito pequenos, como eu disse, 500 kilobytes. Não há relacionamentos entre os registros. Então, além de armazenar quais usuários criaram esse URL, você é praticamente livre para fazer o que quisermos aqui. E outra observação sobre o design do banco de dados e relevante aqui é que nosso serviço será muito pesado na parte vermelha. Vamos precisar, como eu disse, duas tabelas, uma para armazenar as informações sobre os mapeamentos de URL e outra para os dados do usuário, que criou o link curto. Desde que antecipamos armazenar muitas linhas. E também não precisamos manter nenhum relacionamento entre objetos. Agora, o tipo de escolha SQL seria muito bom aqui, pois também é muito fácil de dimensionar. Assim, podemos olhar para algo como o Dynamo DB. Eu vim aqui enquanto você resolve, precisamos criar o esquema de banco de dados em uma entrevista e também pensar que tipo de banco de dados deve ser usado e também sugerir um de seu próprio conhecimento. O sexto passo aqui será o design e o algoritmo básicos do sistema. Então, aqui vamos realmente entrar na implementação de como nosso serviço funcionará nos bastidores. O problema que estamos resolvendo aqui é gerar a chave exclusiva abreviada que será mapeada para um determinado SIC de URL maior e maior. Nesta situação, temos duas abordagens. Podemos gerar essas chaves de linha com um serviço de geração de chaves. E vai gerar cadeias aleatórias de seis letras antemão e armazená-las em um novo banco de dados. Sempre que quisermos encurtar o URL aqui, podemos pegar um que já é gerado pela superfície e anuncia. Essa abordagem é muito simples e rápida, mas como não estamos codificando o URL, então não precisamos nos preocupar com duplicações ou conluições. O serviço da geração de chaves garantirá que todas as chaves serão únicas. Também precisamos ter em mente alguns problemas de simultaneidade aqui, porque assim que uma chave for usada, ela deve ser marcada em nosso banco de dados para garantir que ela não seja usada novamente. E se houver vários servidores que estão lendo essas chaves simultaneamente, você pode ter um cenário em que dois ou mais serviços tentaram ler do banco de dados, mesmo que de cima para o serviço endpoints, seria muito menos provável. Agora, os servidores podem usar esses sistemas de geração para ler e letreiros em um banco de dados. E eles podem usar duas mesas para armazenar as chaves. Uma para as chaves reais que ainda não foram usadas e outra para as chaves que já foram usadas. E assim que esse serviço de geração fornecer a chave para um dos servidores, coma e mova para a mesa. Precisamos também pensar aqui, se nosso sistema de geração, sendo o sistema único de todo o nosso serviço, não seria ruim se ele morresse? E esse é um ponto muito bom porque precisamos ter uma réplica em espera, esse sistema de geração para ter um servidor em espera que possa assumir o controle para gerá-los, forneça fácil no caso de algo acontece com um primário. Agora, outra abordagem aqui, outra degeneração morta das chaves com o serviço. Também é codificar a codificação de URL real. Um URL real pode ser feito calculando um hash exclusivo. Se estivermos falando sobre o tiro 250 assentos ou os cinco vazios, e podemos hash o URL fornecido com esses algoritmos, esses hashes podem ser codificados para exibição. E uma pergunta razoável nessa abordagem seria qual seria o tamanho da chave abreviada? Pode ter seis até 20 caracteres pares, mas isso seria uma chave bastante longa. Podemos usar a codificação base 64. E se vamos usar teclas longas de seis letras, então levará cerca de 64 para a potência de seis cordas possíveis. Se gerássemos teclas longas de oito letras, teremos cerca de 280 trilhões de cadeias de caracteres possíveis. Mas para o nosso sistema, o número da letra seria bastante alto. E podemos supor que seis letras podem ser suficientes para o nosso número de URLs. Agora, se usarmos o algoritmo MD5 como nossa função hash, ele fornecerá, como você já deve saber, valores de hash de 128 bits. Após a codificação base-64, obteremos uma string com mais de 21 caracteres. Agora só temos espaço para seis ou oito caracteres por tecla curta. Como vamos escolher nossa chave então? Bem, podemos pegar as primeiras letras, mas isso pode resultar em duplicação de chaves. E para resolver isso, podemos optar colocar alguns outros caracteres fora da codificação ou trocar entre eles para evitar esse problema completamente. Também podemos, depois de dar a solução em uma entrevista, pensar em alguns problemas com a nossa solução, é que pode não ser à prova de balas e esses diferentes problemas vêm de você e não o entrevistador. Você provavelmente ganhará pontos extras à medida que se torna um eventual funcionário mais consciente. Os diferentes tecidos com a codificação de um URL real usando uma hashtag. Uma solução única pode ser que, se vários usuários inserirem o mesmo URL, eles podem obter o mesmo URL encurtado. Os problemas de simultaneidade é que foi o caso B, a última abordagem também. Mas aqui está outro. E se partes do URL, URL codificadas? As soluções alternativas aqui novamente, acrescentando um número de sequência crescente a cada URL de entrada para torná-lo único e gerar seu hash. E outra solução pode ser anexar o ID do usuário, que deve ser exclusivo ao URL de entrada. Se o usuário não tiver entrado aqui, pode ser um problema porque precisaríamos disso para confirmar a singularidade da chave. Mesmo que depois de todos esses passos que tomamos para garantir que nada cresça poderia acontecer, ainda temos um conflito. Podemos continuar gerando a chave até conseguirmos a única. Encerrando o projeto básico do sistema uma parte do algoritmo. A segunda parte aqui seria o particionamento de dados e a replicação de nosso serviço. Para dimensionar nosso banco de dados, precisamos particioná-lo para que ele possa armazenar mais informações. Precisamos de cerca de bilhões de entradas em nosso banco de dados. E aqui podemos dar uma olhada nos dois tipos de particionamento que existem, que são a chave inglesa e o particionamento baseado em hash. Começando com os URLs do portal de fins de semana de particionamento baseado em intervalo URLs do portal de fins de semana de particionamento baseado em em partições separadas com base nas chaves de hash, caracteres ou até mesmo em uma delas. Assim, podemos salvar todos os URLs começando, por exemplo, trigo ou letra a em uma partição, e salvando os que começam com a letra B em outra , e assim por diante. E olhando em contraste com o particionamento baseado em hash neste esquema, podemos pegar o hash do objeto que estamos armazenando e, em seguida, calcular com base naquela partição usar. No nosso caso, podemos pegar o hash da chave ou o encurtamento para determinar a partição que vamos iniciar esse URL específico. A próxima coisa que precisamos pensar ao abordar o problema de design do sistema é a parte do dinheiro. Assim, podemos capturar URLs acessadas com frequência , como já sugerimos anteriormente. E podemos usar qualquer solução de prateleira que existe lá fora pelo memcached, por exemplo. Mas também podemos armazenar URLs completos. E, ao fazer isso, armazene o URL completo doce seus respectivos hashes em seu surfista de dedicação. Nessa abordagem, antes que você possa pensar, o armazenamento back-end pode verificar rapidamente se o cache já possui o URL de design. E assim, um serviço mais ideal. Também precisamos pensar aqui em quanta memória cache devemos ter. Para que possamos começar. Cerca de 20% do tráfego diário e com base nos padrões de uso do cliente, ajuste além disso, quantos casos de servidores precisamos. Conforme estimado acima, precisamos cerca de 170 gigabytes de memória para lucrar 20% do tráfego. Como um serviço moderno pode ter 256 gigabytes de memória, pode facilmente encaixar todo o dinheiro em uma máquina. Isso foi sobre isso com a parte de armazenamento em cache. Também podemos pensar sobre o balanceador de carga em nosso sistema, o que é bastante simples. Podemos pensar em adicionar essa camada de balanceamento de carga em três lugares. E esses seriam entre os clientes e os servidores de aplicativos, e também entre servidores de aplicativos e servidores de banco de dados e servidores de cache. Passar para a coisa de dança que precisamos pensar quando esses sistemas projetam a pergunta de entrevista dada a nós é a limpeza ou a limpeza do banco de dados. A entrada não deve ficar por aqui para sempre em nosso banco de dados, pois ela a preencheria e transbordaria causando uma falha. Epoch. Existe um tempo de expiração especificado é atingido? O que deve acontecer com o link? Bem, se optássemos por procurar continuamente experimentos para removê-los, isso colocaria muita pressão em nosso banco de dados também. Então, em vez disso, podemos remover lentamente os links expirados fazendo uma limpeza preguiçosa. E a forma como nosso serviço garantirá que apenas os links expirados serão excluídos com B sempre que o usuário tentar acessar o link inspirado, excluímos o código de entrada para o usuário. Dessa forma, não excluir todas as URLs expiraram de uma só vez e arriscando uma falha no banco de dados. Também podemos ter um tempo de expiração padrão para cada link no que diz respeito a esse aspecto. Por fim, também precisamos ter em mente que a árvore limite, que deve responder a algumas perguntas pois quantas vezes o URL curto foi usado. Qual era a localização do usuário? Qual seria a data e a hora do acesso e assim por diante. Parte de segurança e permissões, que é outra importante. Podemos armazenar o nível de permissão com cada URL no banco de dados sendo público ou privado. Para os privados, também podemos criar uma tabela separada para armazenar IDs de usuário que têm permissões para ver esse URL específico. É claro que, se não tiver essa permissão, nosso endpoint ou x está no URL curto, pode retornar um HTTP para um código, o que significa eixo insuficiente. Claro. Isso foi acima todos os ângulos que você precisa ter em mente ao abordar uma solução para a questão de superfície de URL de encurtamento em uma revisão de projeto do sistema. Espero que vocês tenham realmente tirado algo dessa palestra. E eu agradeço muito por ficar comigo até o final. Também estou ansioso para ver vocês no próximo. 5. O aplicativo de compartilhamento de fotos: Olá pessoal e bem-vindos de volta ao tutorial de entrevista de design do sistema onde entendemos como podemos passar por uma entrevista composta por perguntas de sinal C3b. Nesta palestra, vamos discutir outro problema muito comum que é dado esses tipos de entrevistas e dar uma olhada em exatamente como podemos resolvê-los para passar, como eu disse, a entrevista. O problema que não vamos analisar nesta palestra é projetar um serviço de compartilhamento de fotos. Aqui, os usuários podem fazer upload fotos para compartilhá-las com outros usuários. E, claro, alguns serviços semelhantes podem ser Flickr ou algumas plataformas de mídia social, mesmo que tenham mais funcionalidades integradas nelas. Em primeiro lugar, ao abordar esse problema, vou usar o modelo geral que é ajustado para qualquer questão de design do sistema que possa ser dada em uma entrevista sobre a qual falei em uma palestra anterior. E o primeiro passo depois entender completamente a pergunta e fazer qualquer outro aplicativo de consulta que você possa ter de seu entrevistador é definir os requisitos e os objetivos do o sistema sobre o qual você vai falar. Ao projetar nosso aplicativo de compartilhamento de fotos, gostaríamos de ter alguns requisitos funcionais que incluem que um usuário possa seguir alguns outros usuários que têm uma conta nesta plataforma. O usuário também pode realizar algumas pesquisas que podem ser baseadas nas fotos compartilhadas. Você pesquisou também pode fazer upload de fotos da conta deles. E o sistema que implementaremos também deve gerar e exibir algum tipo de feed de notícias onde um usuário, quando abrir o aplicativo, verá as melhores fotos das pessoas que ele lutou contra arcos. Estes são, como eu disse, os requisitos funcionais, mas também precisamos pensar sobre os funcionais. O requisito não funcional número um precisa ser que o sistema seja muito confiável, que significa que, uma vez que o usuário enviar uma foto em nossa superfície, a foto não será perdida. Em seguida, nossa superfície precisa estar altamente disponível, portanto, qualquer dúvida não é permitida. Além disso, devemos manter nossa latência baixa para a regeneração de notícias e coisas assim. Ou seja, a quantidade de tempo que o usuário realmente aguardará de iniciar o aplicativo até o ponto em que ele realmente verá algumas fotos de outros usuários que ele segue. Então, agora o primeiro passo está pronto. E definimos os requisitos e os objetivos do sistema que estamos prestes a projetar. Podemos fazer algumas outras considerações de design. Aqui. Podemos começar pelo fato de que todo esse serviço que vamos implementar, é bastante óbvio que será muito lido pesado porque a dívida líquida quando os usuários realmente enviarão fotos, mas um número muito maior de usuários na verdade, verá as fotos que outros usuários viram. Você pode pensar nisso, como pensaria ao postar uma fotografia em seu aplicativo de mídia social. Você publica muito poucas vezes, mas você realmente vê muitos outros recursos em comparação para ver você realmente carregar. É por isso que esse sistema será lido pesado. Pelo fato de que nosso serviço será lido pesado, precisamos nos concentrar em recuperar. A foto é muito rápida. Agora, os usuários podem carregar tantas fotos quanto a luz do dia também. Então isso é uma coisa a ter em mente porque precisamos um gerenciamento muito eficiente do armazenamento para essas fotos. E também, salvo disse, se um usuário enviar uma foto, esse sistema que projetamos, garantimos que ela não será perdida. Passar para algumas estimativas e restrições para a capacidade das coisas que vamos armazená-lo. Podemos supor que teremos 100 milhões de usuários com cerca de 10 mil usuários ativos diários e 2 milhões de novas fotos todos os dias. Seriam cerca de 23 novas fotos a cada segundo. E esses cálculos que vamos fazer aqui ocorrem em uma data adicional, onde nosso serviço será altamente adotado e bem-sucedido. Então é por isso que você me vê quebrar esses valores muito altos para estes. Números reais. Agora, o espaço total necessário para um dia de fotos, como eu disse, seria de cerca de 2 milhões porque dissemos que teríamos 2 milhões de novas fotos todos os dias. E podemos pensar sobre o tamanho médio do arquivo de fotos, que pode ser de 100 kilobytes, que será cerca de 200 gigabytes no total para nossa capacidade. Agora isso só está levando em conta um dia. Mas e se apontarmos o espaço por, digamos, cinco anos? Bem, podemos multiplicar 200 por 3655 anos, e vamos obter cerca de 365, então 365 terabytes. Agora que temos essa estimativa de capacidade fora do caminho, podemos pensar no design do sistema de alto nível. Porque em um nível alto só precisamos suportar dois cenários. Um para carregar as fotos, que é fluxo de trabalho em nosso serviço. E sim, eles queriam ver ou pesquisar essas fotos. O serviço que vamos implementar, é claro, precisa armazenar as fotos em algum banco de dados. E vamos precisar alguns servidores de armazenamento de objetos aqui. Além disso, para o esquema de banco de dados para armazenar essas fotos, ele também será discutido na entrevista. Precisamos ter em mente que temos cerca de três entidades. Um que será o usuário, em seguida, as fotos e, em seguida, os usuários que eles seguem. O esquema pode estar contendo três tabelas. Quando uma foto, que pode ter um ID com foto, que será a chave primária. E, em seguida, alguns outros campos, como o ID do usuário, que é claro que o usuário morto o publicou, o que será uma chave estrangeira nesta tabela. Então, um outro campo muito importante aqui será a data de criação, que será do tipo datetime. E este é um campo muito importante porque vai ser útil quando o usuário abrir seu feed de notícias, queríamos dar-lhe as fotos mais recentes e populares, mas para a última parte vamos ser útil quando o usuário abrir seu feed de notícias, queríamos dar-lhe as fotos mais recentes e populares, mas para a última parte vamos comer esse campo de batida região. Em seguida, também temos a tabela de usuários, que obviamente terá uma chave primária de ID de usuário. E então alguns outros dados que queríamos armazenar para ele. Se quisermos fazer e-mail marketing pode manter seu e-mail. Mas também precisamos do nome, da data de nascimento, da data de cada conta e talvez do último login. Estou pensando. Também precisaríamos de uma tabela para o usuário seguir, que tomaria um campo que fará parte da chave primária. E isso será, é claro, IDs de usuário dos usuários que se seguem. Portanto, isso, é claro, leva em consideração o cenário em que o usuário de acompanhamento vai para os dois lados, como no Facebook quando você adiciona um amigo. Então, se vocês aceitarem vocês dois como amigos, não como um Instagram onde o seguimento pode ser unidirecional. Então você pode seguir alguém que não o seguiria. Não temos esse cenário nesta discussão apenas para que possamos torná-lo um pouco mais simples. Agora, a abordagem direta para invadir os detectores de esquemas falam seria um MySQL exigir obviamente as articulações, mas podemos armazená-lo em uma loja de valor chave distribuída para aproveitar o benefícios oferecidos pelo NoSQL também. Depois de falarmos sobre o esquema do banco de dados em nossa entrevista, também precisamos fazer outra estimativa do tamanho dos dados. Portanto, o D decide estimativa sobre o contém informações sobre os campos que serão armazenados em nosso banco de dados. E precisamos pensar sobre os números inteiros, cadeias de caracteres e assim por diante. Mais tarde, será armazenado em nosso banco de dados. Podemos supor que cada consulta de entrada e o DateTime passaram quatro bytes. Portanto, cada linha na tabela de usuários terá cerca de 68 bytes. Se tivesse, como eu contei anteriormente, cerca de seis campos. Se tivéssemos, digamos, 250 milhões de usuários, precisaremos de cerca de 16 gigabytes de armazenamento somente para a parte do usuário possa ser armazenada com todas as suas informações em nosso banco de dados. Mas e com as fotos? Então, cada linha na tabela de fotos terá cerca de 284 bytes Cs. Também temos um pacote de fotos, que será var chart até 265 caracteres e que leva 265, assista a entrada da foto que seria bastante maior do que a do usuário, mas isso seria bem normal. Se levarmos em conta cerca de 1 milhão de novas fotos sendo enviadas todos os dias, precisaremos de cerca de 200 e 50 megabytes de armazenamento por um dia. E isso vai ser em dez anos, cerca de um terabyte, quase. A última tabela, cada usuário segue a tabela. E se consistir em oito bytes, tínhamos apenas a chave primária composta por duas integrais, que são cada quatro bytes. Podemos pensar em cerca de 250 milhões de usuários. Eles podem seguir outros 250 milhões de usuários e vamos encontrar outros petabytes adicionais de armazenamento para a tabela seguida do usuário. O espaço total necessário para todas essas tabelas para os ouvidos, como eu disse, seria de cerca de dois terabytes, o que é realmente ótimo para uma aplicação. E a superfície desses tipos. No próximo fim de semana, também analisou rapidamente o design dos componentes que teremos neste serviço. A foto carrega ou fica bem devagar. Leia quem será mais rápido, especialmente se eles estiverem sendo atendidos em dinheiro. Fazendo upload, os usuários podem consumir conexões de deck disponíveis porque o upload é um processo lento e isso significa que não podemos ser atendidos. Qualquer sistema fica ocupado com todas as solicitações certas. Devemos ter em mente que esses serviços da Web têm uma conexão se nos encontrarmos antes de projetar o sistema. Portanto, se você assumir que um servidor da Web pode ter um máximo de 500 conexões em n vez, então ele pode ter mais de 500 uploads simultâneos ou leituras manipuladas com esse gargalo, podemos dividir leituras e grava em serviços separados. Isso também nos permitirá no futuro escalar essas operações de forma independente e muito mais fácil, pois são duas entidades separadas. Para a parte de redundância agora, perder arquivos é que mencionei anteriormente, não é uma opção. Podemos iniciar várias cópias de cada arquivo como solução para dívidas. Porque se um dado de armazenamento, podemos recuperar o quarto muito forte, a outra cópia. Mas o mesmo princípio também se aplica a outros componentes. Então, se quisermos ter a disponibilidade do sistema que seria de alta venda, nosso sistema não estaria morrendo em nenhum momento. Também precisamos ter replicações do serviço em execução. Os serviços diminuíram. O sistema permanece disponível assustador, pois essa redundância remove o ponto único de falha no sistema. Esse é um ponto muito importante. Ao fazer qualquer entrevista de design do sistema, você precisa pensar que se você está implementando está realmente fazendo um único ponto de falha S a dívida é uma desvantagem e precisa ser observada. E você também precisa encontrar uma solução alternativa para isso. Se apenas uma instância dos serviços necessária para executá-la a qualquer momento, poderemos executar uma cópia secundária redundante do serviço que não está servindo nenhum tráfego, mas pode assumir o controle após o fatal para surdos brancos primários tem problema. Como eu disse, são duas instâncias do mesmo serviço em execução na produção e uma falha. O sistema pode fazer failover para a cópia saudável. E isso pode acontecer automaticamente ou exigir intervenção manual, mesmo que, se você não entrar seu sistema em qualquer momento, é melhor implementar e recuperar automaticamente. Porque de outra forma, você precisaria observar que seu sistema é chiclete e, em seguida, intervir manualmente com a dívida do desenvolvedor pode, é claro, por si mesmo, redirecionar o 17º 2D disponível. Também podemos falar sobre o compartilhamento de dados. Porque, é claro, acho que quantidades tão altas de dados, precisamos de alguma forma compartilhá-los. Podemos traçar no ID do usuário para que possamos manter todas as fotos de um usuário no mesmo banco de dados nítido e definido curto é um terabytes. Você precisaria de quatro gráficos para armazenar cerca de quatro terabytes de dados. Agora, para o fim de semana de desempenho e escalabilidade, mantenha cerca de dez deles. Novamente, o sistema FOR cresce cada vez maior, seremos capazes de lidar com todo o tráfego de dívidas. Vamos precisar encontrar o número acentuado pelo usuário múltiplo de dez. Vamos começar por aí. Identifique exclusivamente qualquer foto em nosso sistema. Podemos anexar esse número ao ID da foto, e essa seria uma solução bem simples a esse respeito. Como podemos gerar as identificações de fotos enquanto cada banco de dados pode ter sua própria sequência de incremento automático para os IDs de foto. E como vamos acrescentar essa ideia da identificação com foto nítida, ela a tornará única em todo o nosso sistema. Mesmo que tenhamos criado esse sistema de particionamento, ele tem algumas desvantagens. Por exemplo, se não pudermos armazenar todas as imagens usando demais meu gráfico, temos que distribuí-las para várias delas e causaremos doenças mais altas posteriores. E também os usuários do coração precisam ser tratados de forma bastante diferente porque são seguidos por muitos outros usuários e muitas pessoas. Eles verão o upload das fotos e a dívida pode causar problemas nesse sentido. É claro que podemos particionar o ID da foto e não o ID do usuário, que pode ser outra abordagem. Porque se geralmente esse ID de foto for o primeiro, podemos encontrar o número nítido novamente, módulo de identificação da foto, que significa que eles são menos dígitos basicamente. E, claro, os problemas acima sobre os quais acabamos de falar eram as desvantagens após a primeira abordagem teriam sido resolvidos neste momento. Novamente, para gerar os IDs de foto, você não pode ter uma sequência de incremento automático porque você precisa saber que o ID da foto é primeiro definir a solução nítida aqui pode ser dedicar um banco de dados separado gerar esse ID de incremento automático, precisamos também pensar muito sobre o futuro e misturar nosso crescimento do sistema. Se tivermos um grande número de partições lógicas para acumular o crescimento de dados no início, várias partições lógicas dentro um único banco de dados físico, banco de dados CCS ou podemos ter vários sistemas de bancos de dados em execução nele. Podemos ter bancos de dados separados para cada partição lógica em qualquer servidor. Sempre que achamos que um determinado servidor de banco de dados tem muitos dados, podemos criar algumas partições lógicas para outro servidor e podemos manter um arquivo de configuração. E isso constituiria a única coisa que teríamos que atualizar para anunciar uma eventual mudança. A geração de ranking e feed é outro problema com o qual enfrentamos. A maneira como vamos lidar com isso. Ou pelo menos uma maneira de lidar com isso é pré-gerar o feed dos EUA. Podemos ter alguns servidores que sua única tarefa seria gerar usuários continuamente e armazená-los em outra tabela chamada feed de notícias do usuário. Quando o usuário precisar de barriga esta foto para uma nova suíte, simplesmente consultaremos esta tabela e retornaremos os resultados. Leslie, também precisamos pensar sobre o dinheiro e o balanceamento de carga do sistema como ele será muito usado um, precisamos introduzir um cache para mim para o Serviço de Dados para capturar as linhas do banco de dados. Isso significa as hot folders e os usuários. Podemos usar o caso de demanda para casar esses dados e servidores de aplicativos. Antes de entrar no banco de dados, pode verificar rapidamente se o cache tem as rotas desejadas. Aqui, uma abordagem que seria razoável seria o R U, que é o menos usado recentemente. Para a política de despejo de cache. Podemos construir o integrante mais inteligente Kiersten, estes usando a regra 8020, que afirma que 280% do volume de fotos que serão lidas diariamente, vamos gerar 80% do tráfego, para que possamos apenas descontar os primeiros 20%. Então, isso era sobre todas as etapas e dados intermináveis. Eu consideraria um impotente na entrevista de design do sistema e recebia uma implementação de design de serviço de compartilhamento de fotos. Agradeço muito a vocês por comigo até o final desta palestra. E estou ansioso para vê-lo no próximo.