Título del proyecto: Sistema de descarga distribuida
Introducción: ¿Trabaja en una organización donde la descarga de datos está limitada a unos pocos cientos de Mbs o tal vez unos pocos Gbs? Y adivine lo que necesita para descargar un software que tiene un tamaño dos, tres o quizás 4 veces su límite de datos para un día. ¿Crees que puedes esperar 2, 3 o 4 días para descargar el software? JAJAJA.
¿Quiere engañar a su organización con una descarga más rápida del archivo donde la velocidad es constante (por ejemplo, velocidad FUP -> 2mbps) para todos los usuarios? ¡Sí! lo escuchaste bien. Consiga 2 amigos y haga el trabajo 2 veces más rápido. Reúne a n amigos y el trabajo se hace n veces
Marco conceptual
Los mencionados anteriormente son muy pocos casos de uso básicos de nuestro proyecto. Ahora hablemos de nuestro proyecto.
La idea de nuestro proyecto es proporcionar una plataforma para que los usuarios descarguen archivos grandes en menos tiempo. Esto se hace promoviendo la descarga del archivo en forma de un número específico de particiones. Una vez que se hayan descargado todas las particiones, se pueden fusionar usando la aplicación para obtener el archivo original. El proyecto consta de dos partes:
1. Servidor:Un servidor implementado en Node donde se recibe una solicitud de los clientes. Esta solicitud incluye una URL del archivo que el usuario debe descargar y el número de particiones en las que se debe descargar el archivo (supongamos que el número de particiones es n). El servidor en respuesta envía n claves únicas. Ahora el archivo se descarga en el servidor y se divide en n partes (cada fragmento de tamaño = OrignalFileSize/n). Una vez que se dividen los archivos, cada fragmento de datos se codifica con una clave única. {Esta clave se genera al combinar el u_id de descarga adjunto con el número de serie del fragmento}. Ahora, cuando el servidor recibe una solicitud de descarga de un fragmento. El servidor envía el fragmento de datos sin procesar.
El objeto JSON que debe enviarse al servidor debe verse así:
{ url : 'http://something.com/somename.ext', parts : '20' } If no error in url link or no internal error then a response as such is sent back { "__v": 0, "name": "somename", "ext" : ".ext" "partCount": 3, "_id": "58c522831a3a1919a103c863", "reason": "none", "parts": [], "createdOn": "2017-03-12T10:27:15.827Z", "status": "downloading" } If some error is occurred then err is return with a status code of 500. To initiate downloading parts send a POST request to localhost:3000/retrieve/status. The response looks like this. { "_id": "58c52387f4e3e81a0ccaa1cd", "name": "somename", "ext": ".ext", "partCount": 3, "__v": 1, "reason": "none", "createdOn": "2017-03-12T10:31:35.037Z", "status": "done" }
2. Cliente de Android: una aplicación de Android que permite a un usuario realizar una solicitud de descarga inicial {El usuario que realiza esta solicitud será marcado como administrador para este archivo en particular}. Como se dijo anteriormente, esta solicitud tiene la URL y un número en el que se descargará el archivo. El cliente recibe n claves de servicio. Cada clave se almacenará con el administrador. Ahora el administrador envía estas n claves a sus n amigos. Cada uno de ellos descarga el archivo y lo envía de vuelta al administrador.
Herramientas utilizadas: Lo primero es lo primero, el servidor está basado en Nodes. La aplicación ha sido creada usando Android Studio. La codificación se realizó con Java, mientras que la interfaz de usuario se diseñó con XML. La base de datos local de la aplicación (para la gestión de descargas) se ha creado utilizando SQLite. Las interacciones con la API se han realizado utilizando la biblioteca Volley de Android, que permite una red rápida para aplicaciones y las requests al servidor se realizan en forma de objetos JSON.
Aplicación: El proyecto tiene muchas aplicaciones en la vida real. Dos de ellos que demuestran su utilidad son:
- Descargas más rápidas: esto se puede lograr descargando particiones del archivo en diferentes dispositivos en paralelo y luego combinándolas. Por ejemplo, si se va a descargar un archivo de 5 GB de tamaño, cinco personas diferentes pueden descargarlo en sus dispositivos y luego enviar sus partes a un dispositivo y fusionarlos. Esto reduce el tiempo de descarga a aproximadamente 1/5 del tiempo requerido para descargar el archivo completo.
- Descargas por lotes: si una persona obtiene una cantidad fija de datos de su ISP por día, puede descargar diferentes partes del archivo todos los días hasta que tenga todas las partes. Por ejemplo, en nuestro albergue, obtenemos 1 GB de datos por día que se renueva a la medianoche. Si el archivo no se requiere con mucha urgencia, un estudiante puede esperar un mínimo de 5 días para descargar una partición de 1 GB cada día y finalmente fusionarlos.
Estado:
El proyecto está en desarrollo. A continuación se encuentran los enlaces de GitHub al repositorio del servidor y al repositorio del cliente de Android. El estado actual del proyecto es que el servidor recibe la solicitud, descarga el archivo y lo divide en n partes (enviadas por el usuario) {Esta solicitud obviamente se envía desde el cliente de Android}. El cliente de Android aún no tiene la capacidad de fusionar todos los archivos una vez que se reciben. Además, la UX actual es un poco lenta. Sin embargo, los desarrolladores están encontrando formas de completar el proyecto y lanzarlo como un producto adecuado en el mercado.
Aplicación: https://github.com/DravitLochan/DistributedDownloading-android
Servidor: https://github.com/priyansh1161/distributed-downloading
Planes futuros:
1. Consiga un desarrollador de iOS para un cliente de iOS.
2. Desarrollar un cliente de escritorio para eliminar la dependencia del espacio. {los teléfonos móviles tienen menos espacio que una PC/laptop}
3. Desarrollar un sistema basado en terminal para aquellos a quienes les encanta dar órdenes.
Miembros del equipo:
1. Avinash Sharma
2. Dravit Lochan Gupta
3. Priyansh Gupta
4. Prabhat Shukla
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA