Créditos: Vector de tecnología creado por pikisuperstar - www.freepik.com

Como desarrolladores, a menudo nos encontramos en situaciones en las que debemos construir algo, pero no tenemos el tiempo suficiente para desarrollarnos de la manera que nos gustaría. Y no siempre podemos retrasar los plazos, porque el " tiempo de comercialización " a veces juega un papel crucial en el éxito del producto. ?Asi que que hacemos? Tomamos atajos, tomamos riesgos calculados, soltamos lo purista que hay en ti (mejores prácticas, cobertura de pruebas unitarias y bla bla bla). Supongo que también sería muy similar para la mayoría de ustedes.

La historia de hoy es acerca de cómo construimos una alta escala , con tolerancia a fallos , distribuido sistema de la tabla de posiciones / Marcar puntos, en aproximadamente de una semana en un equipo de tres personas.

Habrá principalmente estos grupos de aprendizaje en este blog.

  1. Técnico : ?Cómo se construye realmente un sistema de este tipo? Deben cubrirse temas como el dise?o de sistemas distribuidos, la escalabilidad, la resiliencia y la disponibilidad.
  2. Trabajar contra el tiempo : cómo entrega en poco tiempo, qué tipo de compensación hace, cómo tomar decisiones más rápido.
  3. Ciclo de vida de desarrollo : también obtiene un adelanto del ciclo de vida de desarrollo de productos, qué tipo de cosas implican la creación de un buen software.

Capítulo 1: Los requisitos

Todo comenzó cuando nuestro equipo de producto dijo que era la temporada de la copa del mundo T20 y queríamos crear un sistema de cuestionarios para nuestros usuarios, para la predicción a corto plazo.

El caso de uso fue que al comienzo de un over, se les pedía a los usuarios que predicasen un escenario para el que tendrían 20/30 segundos. Y al final del over moderador se presentará lo que realmente sucedió entre todos los escenarios previstos. Y la puntuación funcionaría en función de quién respondió correctamente y cuánto tiempo se tomó para responder.

Entonces, inmediatamente después de obtener el requisito, hicimos una estimación del esfuerzo y eso claramente no se ajustaba a nuestro presupuesto, por lo que eliminamos las funciones que podíamos omitir en la versión 0. Esto es importante porque en una fecha límite ajustada, es posible que desee ofrecer menos funciones que las que están a medio hacer.

Este será un blog centrado principalmente en el backend, lo siento, no podré explicar cómo se crearon esas hermosas IU.

Capítulo 2: Dise?o

Lo siguiente fue, obviamente, dise?ar el sistema, que se conoce popularmente como dise?o de alto nivel. Esta fue la parte más desafiante y también la más divertida para mí. No hicimos un dise?o extenso de bajo nivel y tomamos todas las llamadas de modelado sobre la marcha durante la implementación.

Paso 1: estimación de escala

Antes de comenzar cualquier cosa, hicimos una estimación aproximada de qué tipo de tráfico nos iba a golpear. Dada la escala de nuestro sistema, estimamos que tal vez 50.000 personas participarán en el cuestionario. Así que apuntamos a construir para 100.000 usuarios. Pero la mayoría de la gente probablemente respondería en los primeros 10 segundos en una ventana de 30 segundos. Lo que nos da aproximadamente un objetivo de qps de 20k.

Mi regla general es que para un sistema nuevo siempre dise?e el sistema para el doble de usuarios previstos. Para que en caso de que acabes teniendo más usuarios tu sistema no deje de escalar. Y los usuarios generalmente crecen con el tiempo, por lo que no tiene que seguir cambiando el sistema constantemente. Pero eso no significa que coloque el doble de infraestructura en lugar de lo que realmente se requiere. En general, tendría habilitado el ajuste de escala automático en mis sistemas, por lo que siempre que haya picos de tráfico, el sistema se escalará solo.

(También hicimos otras estimaciones sobre el almacenamiento en la caché, pero las omitimos para que el artículo sea breve)

Paso 2: identificación de API de gran escala

Estimación posterior a la escala, identificamos rápidamente cuáles son las API de alta escala y dónde el procesamiento podría ser alto para poder hacer selectivamente un dise?o escalable para ellas. El resto de las API de baja escala que no nos importaron o en las que pasamos mucho tiempo.

Estas son las API de gran escala que identificamos

  1. Obtenga la puntuación y clasificación de los usuarios
  2. Obtener tabla de clasificación
  3. Calcular la tabla de clasificación (principalmente procesamiento de datos, no API)
  4. Publicar la respuesta del usuario

Paso 3: consideraciones de dise?o

Inmediatamente después de ver el requisito, dos cosas me resultaron muy evidentes.

  1. Necesitaremos un procesamiento asincrónico y distribuido para el cálculo de la puntuación y la tabla de clasificación por las razones más obvias. Si planea ejecutar el cálculo de puntaje de forma sincrónica en un solo nodo para 1 millón de usuarios o más, buena suerte ??. La idea es simple, dividimos una gran tarea en tareas más peque?as y las ejecutamos en diferentes nodos, y les dejamos hacer esto a su propio ritmo. Y también queremos que este proceso sea tolerante a fallas .
  2. Cache será nuestro amigo para leer los rangos de un usuario y la tabla de clasificación. Principalmente, por dos razones, la velocidad y la facilidad de escalado . Un caché es mucho más rápido que DB para operaciones de lectura simples y, en general, es más fácil escalar el clúster de Redis / Memcached / Hazelcast que Postgres .

Paso 4: dise?e el sistema

Mientras tomaba las decisiones de dise?o esta vez, elijo ir con técnicos que conocía y no quería aventurarme en encontrar cuál podría ser la mejor tecnología para este caso de uso. Por ejemplo, yo estaba familiarizado con Redis , así que para el caché, era la elección obvia. Además, cada vez que escucho la tabla de clasificación, se traduce automáticamente en conjuntos ordenados de Redis en mi mente. Y para el procesamiento asíncrono, Kafka sigue siendo mi opción número uno. Con el tiempo adecuado, probablemente haría un poco más de exploración, pero por esta vez no iba a vagar por tierras salvajes para encontrar la mejor tecnología porque no tenía TIEMPO.

una. Publicar la API de respuesta del usuario

Entonces, esta API iba a permitir a nuestros usuarios enviar respuestas para el cuestionario. El principal desafío aquí era que esto generaría muchas operaciones de escritura simultáneas , lo que aumentaría mucho la carga en nuestra base de datos. Entonces tuvimos que hacer dos cosas

  1. Disminuir la carga en la base de datos
  2. Genere algún tipo de contrapresión o deje que los operadores de la base de datos trabajen a su propio ritmo, para que la base de datos no se sienta abrumada.

Mi solución de goto para disminuir la carga de escritura es hacer el procesamiento por lotes . Entonces, si tuviera que hacer 10 operaciones de escritura, las agruparía para obtener una sola consulta y luego ejecutar una operación de escritura de 1 DB.

Y Back-Pressure casi grita colas de mensajes .

Entonces, combinando ambos, la solución que se nos ocurrió es esta ...

No te asustes, permíteme explicarte lo que está pasando

  1. El receptor de respuestas recibe las respuestas del usuario y se devuelve un código de estado 202 HTTP. Lo que es como decir que recibí tu solicitud y la voy a procesar, pero sigue adelante y haz lo que estabas haciendo. Este es el primer paso en el procesamiento asíncrono, que no bloqueamos a la persona que llama.
  2. El receptor de respuesta coloca la respuesta del usuario en una cola de mensajes, que nuevamente se particiona por motivos de escalabilidad / disponibilidad / redundancia . Puede comprender la partición con bastante facilidad si ya conoce Kafka. En caso de que no lo haga, simplemente considérelo como una forma de distribuir sus mensajes en su cola en múltiples colas aisladas más peque?as que técnicamente pueden residir en diferentes nodos. Si conoce la fragmentación de la base de datos, entonces es lo mismo, pero sobre todo para las colas de mensajes. No dude en leer más sobre Kafka aquí .
  3. Ahora, el dosificador recibe estas respuestas sin procesar. Y luego crea lotes de 10 mensajes y los empuja a la siguiente etapa de procesamiento.
  4. El escritor de la base de datos recoge los lotes y realiza consultas de inserción en la base de datos. La contrapresión la introduce principalmente el escritor de base de datos, que capta los mensajes a su propio ritmo ya que el consumidor de mensajes se basó en la extracción . Y así evitamos la sobrecarga de la base de datos. Y dado que funciona en lotes en lugar de ejecutar 100 consultas de base de datos, solo ejecutamos 10 consultas de base de datos.

Esto resuelve el 30% de nuestro problema, pasemos al siguiente.

B. Cálculo de puntuación y clasificación

Ahora el elefante en la habitación, el problema principal, el cálculo de la tabla de clasificación. Si ve este sistema, no es como un sistema de prueba tradicional en el que conocemos la respuesta correcta de antemano. Por lo tanto, no podemos calcular los puntajes y la tabla de clasificación tan pronto como alguien responda. Tenemos que calcular la puntuación y la clasificación de todos los usuarios una vez que el moderador ha enviado las respuestas correctas. Así que una gran cantidad de trabajo de una sola vez. Es bastante evidente que ni nuestros nodos ni nuestro servidor de base de datos pueden manejar eso correctamente en una sincronizaciónModa. ?Asi que que hacemos? Volvemos a las colas de mensajes de nuestro amigo para el procesamiento asincrónico nuevamente. Genial para que podamos calcular las puntuaciones de forma asincrónica, pero ?qué pasa con la tabla de clasificación? Eso debe estar disponible todo el tiempo, ?verdad? ?Y el rango? Hasta que, ya menos que se hayan calculado las puntuaciones de todos los usuarios, no se puede poner rangos, ?verdad? Y calcular el rango específicamente podría ser un problema difícil.

Ahora bien, ?quién nos salvará de esto? No te preocupes amigo mío, ?recuerdas que mencioné brevemente a Redis mientras hablaba de caché? Tienen algo hermoso llamado conjunto ordenado (qué creación tan asombrosa, gracias Redis Labs ??). En un conjunto ordenado, puede agregar claves con una puntuación, y Redis lo ordenará en consecuencia en O (log (N)) . Eso solucionará nuestro problema de clasificación ??. También nos permite ejecutar consultas de rango, como darme los 5 primeros u obtener el rango para una clave específica, y todo esto sucede en O (log (N)). Eso es exactamente lo que necesitamos aquí.

Los elementos se agregan a una tabla hash que asigna los objetos de Redis a las puntuaciones. Al mismo tiempo, los elementos se agregan a una lista de omisión que asigna puntajes a los objetos de Redis (por lo que los objetos se ordenan por puntajes en esta "vista") - Elementos internos del conjunto ordenado

Bammmmmm, el problema de la tabla de clasificación también está resuelto.

Muy bien, no es fácil, estaba feliz de haber podido obtener una solución viable rápidamente. Ahora regresemos a nuestro tablero de dibujo.

Parece un poco intimidante, ?no? Permíteme explicarte

  1. Tan pronto como el moderador envía la respuesta correcta, se envía un mensaje de activación del cálculo de la puntuación, que dará inicio a todo el proceso de procesamiento .
  2. El batcher recibe el mensaje de activación y genera un par de DB offset y limit object dependiendo de cuántas personas respondieron correctamente. Por ejemplo, si 10 personas respondieron correctamente y el tama?o del lote es 5, se generarían dos objetos (lotes). Lote 1 {desplazamiento: 0, límite: 5}, lote 2 {desplazamiento: 5, límite 5}. ?Por qué hacemos esto? Para que podamos ejecutar el procesamiento por lotes o ejecutar consultas de bases de datos paginadas y no terminemos llamando a la base de datos sin ningún límite. Entonces, si tuviera que obtener 1 millón de registros de la base de datos, y lo hago de una sola vez, introduciría muchos problemas en muchos lugares. Entonces, lo dividimos en partes más peque?as y ejecutamos consultas más peque?as pero múltiples, lo que devolvería un número menor de filas.
  3. El procesador por lotes del usuario ahora recibirá estos mensajes por lotes y ejecutará consultas a la base de datos en consecuencia. El procesador que recibe el mensaje {offset: 0, limit: 5}, obtendrá los primeros 5 ID de usuario de la base de datos (también hará otra operación por lotes, pero eso es un poco difícil de explicar aquí, por lo que se saltará). Y después de esto es donde decimos adiós al procesamiento por lotes y cambiamos al procesamiento de flujo . Porque el procesador por lotes ahora colocará 5 ID de usuario en la cola que será procesada por el siguiente procesador.
  4. Ahora, la calculadora de puntuación de usuario recibe ID de usuario individuales, ejecuta la lógica de puntuación para calcular las puntuaciones de usuario individual. Luego, realice una actualización de base de datos para modificar la puntuación del usuario. Luego actualiza la puntuación para ese usuario en particular en el conjunto ordenado y Redis asigna o actualiza internamente la clasificación. Y una vez que esta etapa haya terminado de procesarse tendremos las puntuaciones de todos los usuarios en nuestro DB y el ranking + puntuación de todos los usuarios en nuestro Redis. Y dado que tenemos el rango de todos en el conjunto ordenado, podríamos ejecutar una consulta de rango para obtener la tabla de clasificación con una velocidad increíblemente rápida .

La mayor parte de nuestro problema está resuelto ahora, ya que para obtener la puntuación y la clasificación del usuario, podríamos simplemente hacer una consulta de Redis y no llegar a DB. Y esto también acelera nuestros tiempos de respuesta .

Con esto concluye la fase de dise?o principal. También hubo DB, dise?o de API y otras cosas que me estoy saltando aquí.

Capítulo 4: Implementación

La finalización del dise?o resolvió el 70% de nuestros problemas, y sabíamos que podíamos resolver esto, por lo que pasaríamos al desarrollo rápidamente.

En un mundo ideal, iría y crearía un nuevo servicio, probaría un nuevo lenguaje como Go , para un procesamiento paralelo mejor y más rápido y otras cosas. Pero dada la línea de tiempo, no fue lo correcto. Nos limitamos a nuestro servicio principal NodeJS y pusimos todo allí. Los puristas de microservicios pueden perderlo después de ver esta declaración, pero en una carrera contra el tiempo, sus directores deben tomar el asiento trasero a veces. Entre las muchas compensaciones , esta fue una de las principales llamadas que tomamos.

Aparte de esto, también tuvimos que reducir las pruebas unitarias y de integración , cuya culpa todavía nos persigue. Pero estamos completando las pruebas gradualmente después del lanzamiento.

Supongo que después de ver el dise?o detallado publicado arriba, debería poder implementar el suyo, por lo tanto, esta vez no voy a profundizar en el código ??

Capítulo 5: Implementación y monitoreo

Después de algunas correcciones de errores y la aprobación del control de calidad, estábamos listos para comenzar. ?Trabajo bien hecho? No, amigo mío, todavía teníamos que configurar un monitoreo intenso para esta pieza. Dado que se desarrolló en muy poco tiempo, al menos tenía un poco de confianza. De forma predeterminada, teníamos el rastreo habilitado en este servicio a través de LightStep . Entonces, aparte de los seguimientos, configuré un monitoreo dedicado del tráfico, tasas de error, paneles de latencia y alertas para todas las API. Y después de la activación, mis compa?eros de equipo y yo, recibimos una llamada y monitoreamos el sistema durante al menos una hora, desde el uso de RAM y CPU hasta los registros de errores . Así que siempre dé la misma ponderación a la observabilidad.y seguimiento también. Hubo peque?os problemas en el sistema de producción y solo pudimos detectarlos temprano debido a la supervisión.

Capítulo 6: Retrospectiva

El sistema funciona, pero después de un respiro, es importante hacer una retrospectiva e identificar las cosas que nos perdimos y trabajar en ellas. Estoy seguro de que nos perdimos un montón de cosas y cortamos muchas esquinas y obtuvimos un gran alcance de mejora. Por ejemplo, aquí hay un par de ...

Cosas que podríamos hacer mejor

  1. Usamos la base de datos Postgres ya existente para esto, ya que el controlador, el ORM y la infraestructura de soporte ya estaban allí. Pero probablemente exploraría un poco las soluciones de bases de datos.
  2. NodeJS es increíble, pero creo que Go sería una mejor solución para esto. Podríamos haber explorado esto.
  3. Intenté escribir una consulta para calcular la puntuación solo en la base de datos y fallé estrepitosamente. Probablemente podría escribir eso y también podría hacer el procesamiento por lotes para el cálculo de la puntuación, reduciendo aún más las operaciones de la base de datos.
  4. No pudimos ejecutar pruebas exhaustivas de carga y rendimiento, lo cual es imprescindible.
  5. Podríamos haber escrito dos etapas diferentes para la actualización de la puntuación de la base de datos y la actualización del conjunto ordenado de Redis, eso sería una implementación más limpia.

Notas de despedida

Hicimos lo mejor que pudimos en ese corto tiempo. Incluso la implementación se desvió ligeramente del dise?o original. Pero está bien, constantemente habrá compensaciones. A pesar de que completamos la funcionalidad principal en aproximadamente una semana, hubo peque?os parches que tuvimos que publicar.

Espero que hayas podido aprender un par de cosas sobre el dise?o de sistemas y el desarrollo de software hoy ??

Créditos

Saludos a mis increíbles compa?eros de equipo Akash Raj y Aashirwad Kashyap , todos trabajamos juntos para construir esto en solo una semana.

?Gracias por leer!

Soy Aritra Das, soy Desarrolladora y disfruto mucho construyendo sistemas distribuidos complejos. No dude en comunicarse conmigo en Linkedin o Twitter para cualquier tema relacionado con la tecnología.

Feliz aprendizaje…

Suggested posts

Construyendo su propio motor de búsqueda desde cero

?Qué subyace a la búsqueda moderna? Conceptos simples.

Construyendo su propio motor de búsqueda desde cero

?Cuántas veces realiza búsquedas en la web a diario? 5, 20, 50? Si Google es su motor de búsqueda preferido, puede consultar su historial de búsquedas aquí. A pesar de cuán profundamente la búsqueda subyace a nuestras actividades diarias y nuestra interacción con el mundo, pocos de nosotros entendemos cómo funciona.

6 ventajas principales de los desarrolladores de Europa del Este

6 ventajas principales de los desarrolladores de Europa del Este

Comprendiendo por qué las empresas extranjeras buscan contratar desarrolladores de Rusia, Ucrania y Bielorrusia. Durante más de 6 a?os, he estado administrando Rocketech Software Development con un socio, con sede en Singapur y un equipo completamente distribuido. Estamos desarrollando productos de TI y dos formatos de servicio: personal externo y equipo dedicado.

Related posts

Una carta abierta a todos los hombres de mi historia reciente

Queridos hombres, no estoy enojado, solo estoy cansado, principalmente de mí mismo. He sido tan poco auténtico y los he mentido a todos y fue totalmente egoísta.

Gran Breta?a es la ex obsesiva y abusiva de Meghan Markle

Gran Breta?a es la ex obsesiva y abusiva de Meghan Markle

Meghan Markle se ha ido de Gran Breta?a honesta y verdaderamente. Al sentarse hoy con Ellen, no mencionó esa isla ni una sola vez.

IA en teléfonos inteligentes ??

IA en teléfonos inteligentes ??

Los teléfonos inteligentes han evolucionado con el tiempo y continúan siendo el dispositivo más popular del mercado. Sin embargo, en los últimos a?os, la inteligencia artificial ha despertado el interés de las personas.

Siga sus peque?os pasos: ?Qué acción inspirada está tomando hoy?

Siga sus peque?os pasos: ?Qué acción inspirada está tomando hoy?

Sigue los pasos de tu bebé Una frase se quedó atascada en el abismo fascinante de mi mente: "Si no llevas la cuenta, ?cómo sabes que estás ganando?" Después de escuchar esto, mi consciente, subconsciente e inconsciente estaban bailando y festejando como si el mundo me acabara de revelar. Si NO llevo el puntaje, ?cómo demonios sé que al menos estoy progresando? La respuesta es NO.

MORE COOL STUFF

?Jon Hamm se ha casado alguna vez y tiene hijos?

?Jon Hamm se ha casado alguna vez y tiene hijos?

Jon Hamm es bastante reservado acerca de estar casado o en una relación, y rara vez aparece frente a paparazzi con una pareja a su lado.

?Está casado el entrenador de baloncesto de los Duke Blue Devils, Mike Krzyzewski?

?Está casado el entrenador de baloncesto de los Duke Blue Devils, Mike Krzyzewski?

El retiro de Mike Krzyzewski del baloncesto de Duke al final de la temporada actual le dará más tiempo con su esposa y familia.

?Qué tan alto es Nicholas Braun de 'Succession'?

?Qué tan alto es Nicholas Braun de 'Succession'?

Los fanáticos de 'Succession' no pueden evitar notar la estatura inusualmente alta de Greg, alias Nicholas Braun. ?Realmente se eleva por encima de los miembros de su elenco?

'The Pioneer Woman' Ree Drummond Guarniciones de Acción de Gracias para la temporada navide?a de 2021

La mujer pionera Ree Drummond está aquí para prepararte para el Día de Acción de Gracias. éstos son algunos de sus mejores acompa?amientos.

Pruebe nuestro mini crucigrama

Pruebe nuestro mini crucigrama

?Nuestro mini crucigrama actualizado semanalmente combina nuestras lecturas favoritas de HowStuffWorks con pistas inteligentes!

?Qué funciona mejor: cápsulas de lavado, detergentes en polvo o líquidos?

?Qué funciona mejor: cápsulas de lavado, detergentes en polvo o líquidos?

Lavar la ropa ya es bastante malo sin tener que preocuparse por elegir el detergente adecuado. Entonces, ?cuál es mejor? ó acaso importa?

La verdadera historia de la gente azul de Kentucky

La verdadera historia de la gente azul de Kentucky

Las familias Fugate y Combs en la zona rural de Kentucky perdieron la lotería genética, y ambos compartían un rasgo recesivo raro que hacía que su piel se viera azul cuando se casaron. ?Cuál fue la causa de esto? ?Y qué pasó con las familias?

?Podría el cóndor de California 'nacimiento virginal' rescatar la especie?

?Podría el cóndor de California 'nacimiento virginal' rescatar la especie?

Se están criando dos polluelos sin padre en un programa para salvar al cóndor de California de la extinción. ?Cómo son posibles estos nacimientos 'vírgenes'?

Toda la basura que tuve que sentarme antes de ver a Coco

Toda la basura que tuve que sentarme antes de ver a Coco

La aventura congelada de Olaf. Imagen: Walt Disney Studios Cuando llega una nueva película de Pixar, suele ir acompa?ada de un encantador cortometraje animado.

Cómo saltar realmente muy lejos en Super Mario Odyssey

Cómo saltar realmente muy lejos en Super Mario Odyssey

Al combinar los poderes de Mario y Cappy, puede obtener mucho tiempo de espera adicional en Super Mario Odyssey, perfecto para despejar esos espacios extralargos y para ir a donde "se supone" que no debe estar. En caso de que no quiera ver un video, lo desgloso en presentaciones de diapositivas a continuación.

Into the Badlands ha terminado y ya estoy en la retirada de las artes marciales

Into the Badlands ha terminado y ya estoy en la retirada de las artes marciales

Así como así, los seis episodios de Into the Badlands de AMC han terminado (?ya ?!) y, con él, algunas de las batallas en pantalla más fascinantes y elegantes jamás producidas en un programa de televisión estadounidense. Voy a llenar la pausa con oraciones a las deidades de la televisión por cable instando a AMC a dar luz verde oficialmente a una segunda temporada.

?Tápate los oídos! ?Es la peor música de todos los tiempos!

?Tápate los oídos! ?Es la peor música de todos los tiempos!

Phil Collins actuando en Australia en 1985, un espectáculo que probablemente incluyó "Sussudio". (Foto: Bob King / Redferns / Getty Images) Entrada de esta semana: Lista de música considerada la peor De qué se trata: Música.

Cardi B y la hija de Offset, Kulture, muestran hermosas trenzas nuevas en Instagram

Cardi B y la hija de Offset, Kulture, muestran hermosas trenzas nuevas en Instagram

La hija de 3 a?os de Cardi B y Offset, Kulture, mostró su nuevo peinado trenzado en Instagram.

Selena Gomez le da un beso en la mejilla a Cara Delevingne por Kiss Cam en el juego de los Knicks

Selena Gomez le da un beso en la mejilla a Cara Delevingne por Kiss Cam en el juego de los Knicks

"Es muy divertida y extremadamente aventurera", dijo previamente Selena Gomez sobre su amiga Cara Delevingne.

Madonna bebe ginebra de la botella en su gimnasio: 'Entrenamiento de hoy'

Madonna bebe ginebra de la botella en su gimnasio: 'Entrenamiento de hoy'

La cantante decidió cambiar su rutina de ejercicios el jueves.

Jamie Dornan dice que perdió el papel de Superman ante Henry Cavill y se ha acercado a Marvel para un papel de superhéroe

Jamie Dornan dice que perdió el papel de Superman ante Henry Cavill y se ha acercado a Marvel para un papel de superhéroe

Jamie Dornan reveló que hizo una audición para el papel de Superman pero perdió ante Henry Cavill; y ha hablado con Marvel sobre unirse al MCU.

Languages

野花在线观看免费观看大全-野花视频在线观看免费观看8
国足最新出线概率0.08% 北京冬奥火炬宣传片获金花环奖 速度与激情9 得知母亲出事男子在地铁痛哭 国足战澳大利亚大名单:4归化在列 周冠宇成为中国首位F1车手 安娜贝尔 尚气与十环传奇 胡锡进谈中美元首会晤 红色通缉令 尚气与十环传奇 印度首都准备封城 房价上涨城市创七年新低 拐点来了? 24岁救人牺牲消防员获批为烈士 扫黑风暴 我要我们在一起 意大利错失直接晋级世界杯资格 中美元首会谈重点内容 中国共产党第三个历史决议全文发布 灵媒 意大利错失直接晋级世界杯资格 俄方回应卫星碎片危及国际空间站 中美元首是否达成新共识?中方回应 男子写80页PPT拯救爱情却离婚 动保组织向上饶信州区申请信息公开 许家印为恒大注入超70亿续命资金 动保组织向上饶信州区申请信息公开 千与千寻 意大利错失直接晋级世界杯资格 两个女人 浦发银行回应近3亿存款莫名被质押 罗永浩吐槽苹果文案没文化 大连现超级传播者26人在同一传播链 扫黑风暴 安娜贝尔 中美元首会谈重点内容 长津湖 图兰朵 24岁救人牺牲消防员获批为烈士 房价上涨城市创七年新低 拐点来了? 五个扑水的少年 大连一密接者擅自点外卖聚餐被调查 男子写80页PPT拯救爱情却离婚 #耿直真香哥黑化卖惨# 动保组织向上饶信州区申请信息公开 扫黑风暴 失控玩家 扫黑风暴 许家印为恒大注入超70亿续命资金 外交部回应拜登重申不支持台独 加拿大一枝黄花到底是什么? 中国医生 男子体检血中抽出2升油浆 红色通缉令 大连现超级传播者26人在同一传播链 国际人士热议中共十九届六中全会 俄方回应卫星碎片危及国际空间站 怒火·重案 得知母亲出事男子在地铁痛哭 嘉南传 中美元首是否达成新共识?中方回应 浦发银行回应近3亿存款莫名被质押 斗破苍穹 蜘蛛侠:英雄归来 扫黑风暴 林丹世界排名被正式移除 男子体检血中抽出2升油浆 大连现超级传播者26人在同一传播链 扫黑风暴 林丹世界排名被正式移除 国足战澳大利亚大名单:4归化在列
西峡县| 布拖县| 双桥区| 东明县| 花莲县| 百色市| 兖州市| 海口市| 安徽省| 平山县| 平罗县| 宜良县| 林口县| 夏津县| 阿鲁科尔沁旗| 弥勒县| 渝北区| 诸城市| 宜城市| 宁强县| 通许县| 西华县| 汽车| 临武县|