Armazena a imagem do perfil de todos os usuários em um único diretório ou por ID de subdiretório?

1

Estou usando o Amazon S3 como armazenamento para a foto do perfil de usuários. Vejo que muitos sites geram grandes nomes de arquivos aleatórios e os colocam no mesmo diretório raiz, como:

http://xxx.us-east-1.amazonaws.com/aHR0cHM6Ly9mYmNkbi1wcm9maWxlLWEuYWthbWFpaGQubmV0L2hwcm9maWxlLWFrLWFzaDIvMjczMzkxXzEwMDAwMDMxMjAxMzg5OV81NTk3MjM4Mzdfbi5qcGc.jpg

E minha pergunta é: quais são os prós e contras dessa abordagem?

Se eu os coloco em diretórios diferentes, quais problemas terei no futuro?

http://xxx.us-east-1.amazonaws.com/users/id/username.jpg

ou

http://xxx.us-east-1.amazonaws.com/users/id/random_number.jpg

Obrigado!

    
por Luccas 04.09.2012 / 18:11

2 respostas

2

Como você está usando o S3, a quantidade de arquivos não deve ser um problema. No entanto, considere o que acontece quando você precisa procurar um único arquivo manualmente .. A listagem de alguns arquivos zilhão no seu navegador não será divertida.

Portanto, para este caso, você deve ter algum tipo de estrutura de árvore "navegável por humanos", cujos subdiretórios finais contêm uma quantidade razoável de arquivos.

Eu recomendo expandir e dividir o id (supondo que seja numérico) ou prefixar o nome de usuário.

Exemplo de ID:

id1 = 123
id1_expanded = 000/000/000/123
http://xxx.us-east-1.amazonaws.com/users/000/000/000/123/username.jpg

id2 = 1000002
id2_expanded = 000/001/000/002
http://xxx.us-east-1.amazonaws.com/users/000/001/000/002/username.jpg

Exemplo de nome de usuário:

username1 = luccas
http://xxx.us-east-1.amazonaws.com/users/l/lu/luc/luccas/random_number.jpg

username2 = ukautz
http://xxx.us-east-1.amazonaws.com/users/u/uk/uka/ukautz/random_number.jpg

Em qualquer caso, a maioria das estratégias inventadas para o design da estrutura de armazenamento tenta resolver os problemas que você simplesmente não tem no S3: quantidade de arquivos por diretório, sharding em servidores de armazenamento ... coisas assim.

Editar : Os longos nomes de arquivos que você descreveu são geralmente escolhidos por motivos de "segurança" - > Contanto que você não use um algoritmo para derivá-lo do username + id, qualquer relação entre o arquivo e um usuário específico é ocultada (dado apenas o nome do arquivo). Novamente: use algum tipo de estratégia de subdiretório (pelo motivo discutido acima).

    
por 11.09.2012 / 01:39
1

Depende de quantas imagens você vai usar. Se seu aplicativo usa milhões de imagens, é melhor agrupá-las em outro servidor apenas para balancear a carga. Você também pode dividir as imagens com base no tipo de perfil de usuário. Coloque todo o perfil do usuário com base em categorias. No final do dia, tudo o que você precisa saber é como o seu servidor carregará bem as solicitações. Esta é apenas uma suposição teórica. ter a especificação de hardware e quantidade de imagens faria sentido.

    
por 10.09.2012 / 22:20