Advertisement
Guest User

Untitled

a guest
May 25th, 2019
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.85 KB | None | 0 0
  1. ### BAJAR EL PROYECTO DE GITHUB ###
  2.  
  3. git clone https://github.com/burzak/capacitacion.git
  4. git checkout master
  5. git pull upstream master
  6. git push origin master
  7. git branch examen-juanma
  8. git checkout examen-juanma
  9.  
  10. #### DOCKER - RABBITMQ ####
  11.  
  12. docker pull rabbitmq:management
  13.  
  14. docker create -it -p 10000:15672 -p 10001:5672 --name mirabbit rabbitmq:management
  15.  
  16. docker start mirabbit
  17.  
  18. # En la carpeta del proyecto
  19.  
  20. php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
  21. php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
  22. php composer-setup.php
  23. php -r "unlink('composer-setup.php');"
  24.  
  25. php composer.phar require php-amqplib/php-amqplib
  26.  
  27. # composer.json
  28.  
  29. {
  30. "require": {
  31. "php-amqplib/php-amqplib": ">=2.6.1"
  32.  
  33. },
  34. "autoload": {
  35. "psr-4": {
  36. "PhpAmqpLib\\": "PhpAmqpLib/"
  37. }
  38. }
  39. }
  40.  
  41. # composer update
  42.  
  43. php composer.phar update
  44. php composer.phar dumpautoload -o
  45.  
  46. # send.php
  47.  
  48. <?php
  49.  
  50. require_once __DIR__ . '/vendor/autoload.php';
  51.  
  52. use PhpAmqpLib\Connection\AMQPStreamConnection;
  53. use PhpAmqpLib\Message\AMQPMessage;
  54.  
  55. $lines = trim(fgets(STDIN));
  56. $connection = new AMQPStreamConnection('10.90.242.122', 10001, 'guest', 'guest');
  57. $channel = $connection->channel();
  58. $channel->queue_declare('mensajes', false, false, false, false);
  59.  
  60. $msg = new AMQPMessage($lines);
  61. $channel->basic_publish($msg, '', 'mensajes');
  62. echo " [x] Sent letras\n";
  63. $channel->close();
  64. $connection->close();
  65.  
  66. ?>
  67.  
  68. # recieve.php
  69.  
  70. <?php
  71. require_once __DIR__ . '/vendor/autoload.php';
  72.  
  73. use PhpAmqpLib\Connection\AMQPStreamConnection;
  74.  
  75. $connection = new AMQPStreamConnection('10.90.242.122', 10001, 'guest', 'guest');
  76. $channel = $connection->channel();
  77. $channel->queue_declare('chat10', false, false, false, false);
  78. echo " [*] Waiting for messages. To exit press CTRL+C\n";
  79.  
  80. $callback = function ($msg) {
  81. echo ' [x] Received ', $msg->body, "\n";
  82. };
  83.  
  84. $channel->basic_consume('chat10', '', false, true, false, false, $callback);
  85. while (count($channel->callbacks)) {
  86. $channel->wait();
  87. }
  88. $channel->close();
  89. $connection->close();
  90.  
  91. ?>
  92.  
  93. ### Teoría replicación ###
  94.  
  95. [master-master]: master-master.png
  96. [master-slave]: master-slave.png
  97.  
  98. # Escenario Ficticio para master-master
  99.  
  100. Para resguardar la información, yo replicaría con el método master-master
  101. agregando XXXX nodos. Lo haría de esta manera porque en este tipo de sistema
  102. distribuido es fundamental una alta disponibilidad de la información. Este
  103. método de replicación permite que los datos esten alojados en distintas
  104. computadoras y actualizados por cualquiera de estas computadoras. De esta
  105. manera cualquier nodo puede responder peticiones de los clientes.
  106. Desventajas :
  107. Este sistema podría tener problemas de consistencia. Al permitir escribir en cualquier nodo, por ejemplo si estoy modifiando un dato en una base y alguien está leyendo el mismo dato en otra base
  108. no va a tener la última versión del mimso.
  109.  
  110. [master-master]
  111.  
  112. # Escenario Ficticio para master-slave
  113.  
  114. Para resguardar la información, yo replicaría con el método master-slave
  115. agregando XXXX esclavos.
  116. La replicación master slave consiste en utilizar una base de datos para la
  117. escritura y otra o varias bases de datos para la lectura.
  118. Esto nos permite tener varias copias sincronizas de nuestra base de datos
  119. principal, cualquier cambio en el maestro (master) se replicará en los
  120. esclavos (slaves), esta configuración nos proporciona escalabilidad y backup,
  121. entre otras cosas, como por ejemplo hacer consultas sobre la réplica sin
  122. afectar a la base de datos principal.
  123. Desventajas:
  124. Tiempo de inactividad y posible perdida de datos cuando falla un maestro.
  125.  
  126. [master-slave]
  127.  
  128. ### THREADS ###
  129.  
  130. # 3 metodos:
  131. start(para prender el tread)
  132. run(el que ejecuta el codigo)
  133. join(espera que el proceso termine)
  134.  
  135. import threading
  136. import random
  137. import time
  138.  
  139. superlista = []
  140. for n in range(1000):
  141. superlista.append(n)
  142.  
  143. print('Resultado deberia ser: ', (999*1000)/2)
  144. class SuperContador(threading.Thread):
  145. def __init__(self, inicio, end, lista):
  146. super().__init__()
  147. self.inicio = inicio
  148. self.end = end
  149. self.lista = lista
  150. self.total = 0
  151.  
  152.  
  153. def run(self):
  154. for n in range(self.inicio, self.end+1):
  155. self.total += self.lista[n]
  156. time.sleep(1.0/100.0)
  157.  
  158. def dameTotal(self):
  159. return self.total
  160.  
  161. procesos = []
  162.  
  163. procesos.append(SuperContador(0, 199, superlista))
  164. procesos.append(SuperContador(200, 399, superlista))
  165. procesos.append(SuperContador(400, 599, superlista))
  166. procesos.append(SuperContador(600, 799, superlista))
  167. procesos.append(SuperContador(800, 999, superlista))
  168.  
  169. for proceso in procesos:
  170. proceso.start()
  171.  
  172. resultado = 0
  173. for proceso in procesos:
  174. proceso.join()
  175. resultado += proceso.dameTotal()
  176.  
  177.  
  178.  
  179. print('El resultado es: ', resultado)
  180.  
  181. ### CQRS ###
  182.  
  183. <?php
  184. class Cola {
  185. private $_data = array();
  186. public function encolar($element) {
  187. $this->_data[] = $element;
  188. }
  189. public function desencolar() {
  190. return array_shift($this->_data);
  191. }
  192. public function estaVacia() {
  193. //return count($this->_data) == 0;
  194. if(count($this->_data) == 0){
  195. return true;
  196. }
  197. return false;
  198. }
  199. }
  200. class Persona {
  201. private $nombre;
  202. private $dni;
  203. public function __construct($nombre, $dni) {
  204. $this->nombre = $nombre;
  205. $this->dni = $dni;
  206. }
  207. public function dameNombre() { return $this->nombre; }
  208. public function dameDNI() { return $this->dni; }
  209. }
  210. class DB {
  211. private $db = array();
  212. public function insert($id, $obj) {
  213. $this->db[$id] = $obj;
  214. }
  215. public function delete($id) {
  216. unset($this->db[$id]);
  217. }
  218. public function get($id) {
  219. return $this->db[$id];
  220. }
  221. public function getAll() {
  222. return $this->db;
  223.  
  224. }
  225. }
  226. class DBMongo
  227. {
  228. private $collection;
  229.  
  230. public function __construct($dbName, $collectionName)
  231. {
  232. $connection = new MongoDB\Client("mongodb://localhost:27017");
  233. $this->collection = $connection->$dbName->$collectionName;
  234. }
  235. public function getElemento($dni)
  236. {
  237. if($this->collection->findOne(['dni' => $dni])['dni'] == $dni){
  238. return $this->collection->findOne(['dni' => $dni]);
  239. }else{
  240. echo 'No existe el registro';
  241. }
  242. }
  243. public function insert($id, Persona $person)
  244. {
  245. if($this->collection->findOne(['dni' => $person->getId()])){
  246. //echo 'Ya existe este registro';
  247. return false;
  248. }else{
  249. $result = $this->collection->insertOne($person->serializador());
  250. return $result->getInsertedCount();
  251. }
  252. }
  253. public function delete($id)
  254. {
  255. if($this->collection->findOne(['dni' => $id])){
  256. //echo 'Registro eliminado';
  257. return $this->collection->deleteOne(['dni' => $id]);
  258. }else{
  259. //echo 'No se puede borrar, registro inexistente';
  260. return false;
  261. }
  262. }
  263. public function drop(){
  264. $this->collection->drop();
  265. }
  266.  
  267. }
  268. class Cluster {
  269. private $dbs = array();
  270. private $cola;
  271. public function __construct(Cola $cola) {
  272. $this->cola = $cola;
  273. }
  274. public function guardar(Persona $persona) {
  275. $a_donde = $persona->dameDNI() % count($this->dbs);
  276. $this->dbs[$a_donde]->insert($persona->dameDni(), $persona);
  277. }
  278. public function borrar(Persona $persona) {
  279. $a_donde = $persona->dameDNI() % count($this->dbs);
  280. $this->dbs[$a_donde]->delete($persona->dameDni());
  281. }
  282. public function agregarDB($db) {
  283. $this->dbs[] = $db;
  284. foreach ($this->dbs as $dbKey => $db) {
  285. foreach ($db->getAll() as $keyUsuario => $usuario) {
  286.  
  287. $a_donde = $usuario->dameDNI() % count($this->dbs);
  288. if ($a_donde != $dbKey) {
  289. $this->cola->encolar($usuario);
  290. }
  291. }
  292. }
  293.  
  294. }
  295. public function migrar() {
  296. while(!$this->cola->estaVacia()) {
  297. $usuario = $this->cola->desencolar();
  298. $viejoLugar = $usuario->dameDNI() % (count($this->dbs)-1);
  299. $nuevoLugar = $usuario->dameDNI() % count($this->dbs);
  300. $this->dbs[$nuevoLugar]->insert($usuario->dameDni(), $usuario);
  301. $this->dbs[$viejoLugar]->delete($usuario->dameDNI());
  302. }
  303. }
  304. public function mostarResumen() {
  305. foreach ($this->dbs as $dbKey => $db) {
  306. echo "DB: $dbKey - Cantidad: ".count($db->getAll())."\n";
  307. }
  308. }
  309. }
  310. $cola = new Cola();
  311. //var_dump($cola);
  312. $cluster = new Cluster($cola);
  313. $db = new DB();
  314. $cluster->agregarDB($db);
  315. $cluster->migrar();
  316. $db = new DB();
  317. $cluster->agregarDB($db);
  318. $cluster->migrar();
  319. $db = new DB();
  320. $cluster->agregarDB($db);
  321. $cluster->migrar();
  322.  
  323.  
  324. $cluster->guardar(new Persona("Pepe", 32));
  325. $cluster->guardar(new Persona("Matias", 10));
  326. $cluster->guardar(new Persona("Julian", 9));
  327. $cluster->guardar(new Persona("Jose", 44));
  328. $cluster->guardar(new Persona("Adrian", 55));
  329. $cluster->guardar(new Persona("KP", 60));
  330. $cluster->guardar(new Persona("Tomy", 70));
  331. $cluster->mostarResumen();
  332. echo '-------------------' . "\n";
  333. $db3 = new DB();
  334. $cluster->agregarDB($db3);
  335. $cluster->migrar();
  336.  
  337.  
  338. $cluster->mostarResumen();
  339.  
  340. ?>
  341.  
  342. ## HACER PULL REQUEST
  343.  
  344. Una vez hechos todos los cambios
  345. Hacer gitignore de vendor
  346.  
  347. git add .
  348. git commit -m "Subiendo exámen Juan Martin Gonzalez"
  349. git push origin examen-juanma
  350.  
  351. Hacer click en "Compare & Pull Request"
  352. Escribir cambios del Pull Request.
  353. Si todo está bien, enviar con el botón "Send Pull Request".
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement