Compare commits
1 Commits
melnikov-k
...
melnikov-k
| Author | SHA1 | Date | |
|---|---|---|---|
| e94714ed8f |
@@ -1,43 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 17
|
|
||||||
VisualStudioVersion = 17.5.002.0
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tasks", "tasks", "{224C88C4-CE1E-473D-AE79-1834542D1192}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "moiseev-vv", "moiseev-vv", "{CF77CC64-0D67-45B7-AEBD-177B182FAEE2}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lab_2", "lab_2", "{167DA3B2-5001-43BD-8029-D980B3AC3DB2}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "worker-1", "tasks\moiseev-vv\lab_2\worker-1\worker-1.csproj", "{713B1088-763A-49FA-A6F5-BC1A12631F7A}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "worker-2", "tasks\moiseev-vv\lab_2\worker-2\worker-2.csproj", "{DB20606C-AD61-4A0E-825D-6DA8BB71D3C2}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{713B1088-763A-49FA-A6F5-BC1A12631F7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{713B1088-763A-49FA-A6F5-BC1A12631F7A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{713B1088-763A-49FA-A6F5-BC1A12631F7A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{713B1088-763A-49FA-A6F5-BC1A12631F7A}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{DB20606C-AD61-4A0E-825D-6DA8BB71D3C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{DB20606C-AD61-4A0E-825D-6DA8BB71D3C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{DB20606C-AD61-4A0E-825D-6DA8BB71D3C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{DB20606C-AD61-4A0E-825D-6DA8BB71D3C2}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(NestedProjects) = preSolution
|
|
||||||
{CF77CC64-0D67-45B7-AEBD-177B182FAEE2} = {224C88C4-CE1E-473D-AE79-1834542D1192}
|
|
||||||
{167DA3B2-5001-43BD-8029-D980B3AC3DB2} = {CF77CC64-0D67-45B7-AEBD-177B182FAEE2}
|
|
||||||
{713B1088-763A-49FA-A6F5-BC1A12631F7A} = {167DA3B2-5001-43BD-8029-D980B3AC3DB2}
|
|
||||||
{DB20606C-AD61-4A0E-825D-6DA8BB71D3C2} = {167DA3B2-5001-43BD-8029-D980B3AC3DB2}
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
SolutionGuid = {D13A4C12-DAC7-43D7-B3CC-CFD6D4EEEA6B}
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
# Отчет по лабораторной работе №8
|
|
||||||
|
|
||||||
Выполнил студент гр. ИСЭбд-41 Мельников К.Ю.
|
|
||||||
|
|
||||||
## Задачи
|
|
||||||
|
|
||||||
Написать небольшое эссе (буквально несколько абзацев) своими словами. А помогут Вам в этом вопросы из списка:
|
|
||||||
|
|
||||||
1. Зачем сложные системы (например, социальная сеть ВКонтакте) пишутся в "распределенном" стиле, где каждое отдельное приложение (или сервис) функционально выполняет только ограниченный спектр задач?
|
|
||||||
|
|
||||||
2. Для чего были созданы системы оркестрации приложений? Каким образом они упрощают / усложняют разработку и сопровождение распределенных систем?
|
|
||||||
|
|
||||||
3. Для чего нужны очереди обработки сообщений и что может подразумеваться под сообщениями?
|
|
||||||
|
|
||||||
4. Какие преимущества и недостатки распределенных приложений существуют на Ваш взгляд?
|
|
||||||
|
|
||||||
5. Целесообразно ли в сложную распределенную систему внедрять параллельные вычисления? Приведите примеры, когда это действительно нужно, а когда нет.
|
|
||||||
|
|
||||||
## Эссе
|
|
||||||
|
|
||||||
1. Cложные системы (например, социальная сеть ВКонтакте) пишутся в "распределенном" стиле, для достижения следующих преимуществ:
|
|
||||||
|
|
||||||
Масштабируемость: Когда количество пользователей и объем данных постоянно растут, необходимо распределить нагрузку и обеспечить высокую производительность системы. Распределенный подход позволяет горизонтально масштабировать систему путем добавления новых приложений или сервисов. Каждое из них может быть настроено на обработку определенного набора задач, таких как управление профилями пользователей, обработка сообщений или хранение изображений. Это позволяет балансировать нагрузку и распределить задачи между различными компонентами системы.
|
|
||||||
|
|
||||||
Гибкость и независимость: Разделение функциональности на отдельные приложения или сервисы позволяет разработчикам работать над ними независимо друг от друга. Это упрощает сопровождение и развитие системы, поскольку изменения в одном компоненте, например, в системе аутентификации, не затрагивают другие компоненты, такие как система чата или новостная лента.
|
|
||||||
|
|
||||||
Балансировка нагрузки: Если один компонент становится перегруженным, другие могут взять на себя часть нагрузки, обеспечивая более равномерное распределение работы: В распределенной системе наличие отдельных приложений или сервисов означает, что если один из них выходит из строя или недоступен, остальные все еще могут работать. Системы могут быть спроектированы с использованием механизмов отказоустойчивости, таких как репликация данных, чтобы обеспечить непрерывную работу системы даже при возникновении сбоев.
|
|
||||||
|
|
||||||
Производительность: Распределение задач между различными компонентами позволяет параллельно обрабатывать запросы, оптимизировать производительность и улучшать отзывчивость системы. Например, каждый компонент может иметь свою собственную базу данных, что уменьшает конфликты при параллельной обработке запросов к данным.
|
|
||||||
|
|
||||||
2. Системы оркестрации приложений были созданы для управления и координации работы распределенных систем. Они упрощают разработку и сопровождение распределенных систем, предоставляя автоматизацию процессов развертывания, масштабирования, управления и мониторинга приложений. Это позволяет снизить вероятность ошибок, упростить работу разработчиков и операторов,обеспечить гибкость внесения изменений и обновлений системы, а также обеспечить мониторинг и отказоустойчивость.
|
|
||||||
|
|
||||||
Однако использование систем оркестрации приложений может усложнить разработку и сопровождение распределенных систем из-за необходимости изучения новых инструментов и концепций, дополнительных зависимостей и требований к окружению, а также возможного усложнения конфигурации и управления системой.
|
|
||||||
|
|
||||||
3. Очереди обработки сообщений являются мощным инструментом для управления и координации асинхронной обработки информации. Они позволяют разделить отправку и получение данных, обеспечивая асинхронность и возможность обработки задач в определенном порядке.
|
|
||||||
|
|
||||||
Под сообщениями может пониматься различная информация, которую требуется передать или обработать. Например, это могут быть запросы от пользователей, события системы, уведомления, задачи на обработку данных и т.д. Все эти сообщения могут быть различного типа и носить разную смысловую нагрузку.
|
|
||||||
|
|
||||||
Очереди сообщений позволяют эффективно управлять потоком информации, реализовывать механизмы повторной обработки, обеспечивать масштабируемость и гибкость системы. Они также увеличивают надежность и отказоустойчивость, позволяя сохранять сообщения и обрабатывать их в случае возникновения ошибок или сбоев.
|
|
||||||
|
|
||||||
4. Преимущества распределенных приложений:
|
|
||||||
|
|
||||||
Масштабируемость: легко масштабируются для обработки большого количества запросов и удовлетворения потребностей пользователей.
|
|
||||||
|
|
||||||
Гибкость и универсальность: Гибкость и универсальность: позволяют использовать различные технологии и платформы для создания гибкой и функциональной системы.
|
|
||||||
|
|
||||||
Надежность и отказоустойчивость: Надежность и отказоустойчивость: предотвращают единую точку отказа, обеспечивают доступность и сохранность данных даже при сбое компонентов системы.
|
|
||||||
|
|
||||||
Недостатки распределенных приложений:
|
|
||||||
|
|
||||||
Сложность разработки: требуется более сложное проектирование и разработка из-за взаимодействия компонентов через сеть.
|
|
||||||
|
|
||||||
Управление сетью: требуется внимание к управлению сетью для обеспечения надежной коммуникации между компонентами.
|
|
||||||
|
|
||||||
Безопасность: требуется использование механизмов шифрования и аутентификации для защиты информации и предотвращения несанкционированного доступа.
|
|
||||||
|
|
||||||
5. Внедрение параллельных вычислений в сложную распределенную систему может быть целесообразным, если:
|
|
||||||
|
|
||||||
Необходимо обрабатывать большие объемы данных, чтобы разделить задачи на более мелкие части и выполнять их параллельно, ускоряя обработку.
|
|
||||||
|
|
||||||
Используются сложные аналитические задачи, такие как машинное обучение или анализ больших данных, чтобы повысить производительность.
|
|
||||||
|
|
||||||
Требуется обрабатывать запросы в реальном времени от множества пользователей одновременно, чтобы эффективно распределять нагрузку.
|
|
||||||
|
|
||||||
Однако, внедрение параллельных вычислений может быть излишним или нецелесообразным в случаях:
|
|
||||||
|
|
||||||
Когда задачи в системе являются простыми и не требуют большого количества вычислительных ресурсов.
|
|
||||||
|
|
||||||
При обработке небольших объемов данных, где применение параллельных вычислений не принесет заметных преимуществ.
|
|
||||||
|
|
||||||
Когда у системы ограниченные ресурсы или ограничения по масштабируемости, что может привести к использованию ресурсов неэффективно.
|
|
||||||
|
|
||||||
Итак, внедрение параллельных вычислений следует рассматривать в зависимости от задач, требований и ограничений системы для определения его целесообразности.
|
|
||||||
|
|
||||||
|
|
||||||
3
tasks/melnikov-ky/lab_4/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
1
tasks/melnikov-ky/lab_4/.idea/.name
generated
Normal file
@@ -0,0 +1 @@
|
|||||||
|
receive.py
|
||||||
6
tasks/melnikov-ky/lab_4/.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
||||||
7
tasks/melnikov-ky/lab_4/.idea/misc.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Black">
|
||||||
|
<option name="sdkName" value="Python 3.12 (python4Lab)" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (python4Lab)" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
||||||
8
tasks/melnikov-ky/lab_4/.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/python4Lab.iml" filepath="$PROJECT_DIR$/.idea/python4Lab.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
10
tasks/melnikov-ky/lab_4/.idea/python4Lab.iml
generated
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
6
tasks/melnikov-ky/lab_4/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
20
tasks/melnikov-ky/lab_4/MainTask/Consumer_1.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import pika
|
||||||
|
import time
|
||||||
|
|
||||||
|
def process_message(ch, method, properties, body):
|
||||||
|
print(f"Получено сообщение: {body}")
|
||||||
|
time.sleep(3)
|
||||||
|
print("Сообщение успешно обработано")
|
||||||
|
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
result = channel.queue_declare(queue='', exclusive=True)
|
||||||
|
queue_name = result.method.queue
|
||||||
|
|
||||||
|
channel.queue_bind(exchange='Agreements', queue=queue_name)
|
||||||
|
|
||||||
|
channel.basic_consume(queue=queue_name, on_message_callback=process_message, auto_ack=True)
|
||||||
|
|
||||||
|
print('Ожидание сообщений...')
|
||||||
|
channel.start_consuming()
|
||||||
19
tasks/melnikov-ky/lab_4/MainTask/Consumer_2.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import pika
|
||||||
|
|
||||||
|
|
||||||
|
def process_message(ch, method, properties, body):
|
||||||
|
print(f"Получено сообщение: {body}")
|
||||||
|
print("Сообщение успешно обработано")
|
||||||
|
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
result = channel.queue_declare(queue='', exclusive=True)
|
||||||
|
queue_name = result.method.queue
|
||||||
|
|
||||||
|
channel.queue_bind(exchange='Agreements', queue=queue_name)
|
||||||
|
|
||||||
|
channel.basic_consume(queue=queue_name, on_message_callback=process_message, auto_ack=True)
|
||||||
|
|
||||||
|
print('Ожидание сообщений...')
|
||||||
|
channel.start_consuming()
|
||||||
19
tasks/melnikov-ky/lab_4/MainTask/Publisher.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import pika
|
||||||
|
import time
|
||||||
|
import random
|
||||||
|
|
||||||
|
collection = ["Application for Travel Agency", "Buying tickets", "Execution of the agreement", "Check-into a hotel"]
|
||||||
|
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
channel.exchange_declare(exchange='Agreements', exchange_type='fanout')
|
||||||
|
|
||||||
|
while True:
|
||||||
|
message = f"Message: {random.choice(collection)}"
|
||||||
|
|
||||||
|
channel.basic_publish(exchange='Agreements', routing_key='', body=message)
|
||||||
|
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
connection.close()
|
||||||
160
tasks/melnikov-ky/lab_4/Python.gitignore
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
share/python-wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.nox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
*.py,cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
cover/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
db.sqlite3
|
||||||
|
db.sqlite3-journal
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
.pybuilder/
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# IPython
|
||||||
|
profile_default/
|
||||||
|
ipython_config.py
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
# For a library or package, you might want to ignore these files since the code is
|
||||||
|
# intended to run in multiple environments; otherwise, check them in:
|
||||||
|
# .python-version
|
||||||
|
|
||||||
|
# pipenv
|
||||||
|
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||||
|
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||||
|
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||||
|
# install all needed dependencies.
|
||||||
|
#Pipfile.lock
|
||||||
|
|
||||||
|
# poetry
|
||||||
|
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||||
|
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||||
|
# commonly ignored for libraries.
|
||||||
|
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||||
|
#poetry.lock
|
||||||
|
|
||||||
|
# pdm
|
||||||
|
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||||
|
#pdm.lock
|
||||||
|
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||||
|
# in version control.
|
||||||
|
# https://pdm.fming.dev/#use-with-ide
|
||||||
|
.pdm.toml
|
||||||
|
|
||||||
|
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||||
|
__pypackages__/
|
||||||
|
|
||||||
|
# Celery stuff
|
||||||
|
celerybeat-schedule
|
||||||
|
celerybeat.pid
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
.dmypy.json
|
||||||
|
dmypy.json
|
||||||
|
|
||||||
|
# Pyre type checker
|
||||||
|
.pyre/
|
||||||
|
|
||||||
|
# pytype static type analyzer
|
||||||
|
.pytype/
|
||||||
|
|
||||||
|
# Cython debug symbols
|
||||||
|
cython_debug/
|
||||||
|
|
||||||
|
# PyCharm
|
||||||
|
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||||
|
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||||
|
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||||
|
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||||
|
#.idea/
|
||||||
116
tasks/melnikov-ky/lab_4/README.md
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
# Отчет по лабораторной работе №4
|
||||||
|
|
||||||
|
Выполнил студент гр. ИСЭбд-41 Мельников К.Ю.
|
||||||
|
|
||||||
|
## Прохождение tutorial
|
||||||
|
|
||||||
|
Установил rabbitMQ server, erlang и зашел в брокер под гостем по http://localhost:15672/#/
|
||||||
|
|
||||||
|
Туториал 1:
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
Туториал 2:
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
Туториал 3:
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
## Разработка демонстрационных приложений
|
||||||
|
|
||||||
|
Предметная область: Дополенительные соглашения и договора на заселение в отель Туристического агентства.
|
||||||
|
Разработа три приложения согласно предметной области.
|
||||||
|
|
||||||
|
1. Publisher
|
||||||
|
|
||||||
|
```py
|
||||||
|
import pika
|
||||||
|
import time
|
||||||
|
import random
|
||||||
|
|
||||||
|
collection = ["Application for Travel Agency", "Buying tickets", "Execution of the agreement", "Check-into a hotel"]
|
||||||
|
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
channel.exchange_declare(exchange='Agreements', exchange_type='fanout')
|
||||||
|
|
||||||
|
while True:
|
||||||
|
message = f"Message: {random.choice(collection)}"
|
||||||
|
|
||||||
|
channel.basic_publish(exchange='Agreements', routing_key='', body=message)
|
||||||
|
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
connection.close()
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Consumer 1.
|
||||||
|
|
||||||
|
```py
|
||||||
|
import pika
|
||||||
|
import time
|
||||||
|
|
||||||
|
def process_message(ch, method, properties, body):
|
||||||
|
print(f"Получено сообщение: {body}")
|
||||||
|
time.sleep(3)
|
||||||
|
print("Сообщение успешно обработано")
|
||||||
|
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
result = channel.queue_declare(queue='', exclusive=True)
|
||||||
|
queue_name = result.method.queue
|
||||||
|
|
||||||
|
channel.queue_bind(exchange='Agreements', queue=queue_name)
|
||||||
|
|
||||||
|
channel.basic_consume(queue=queue_name, on_message_callback=process_message, auto_ack=True)
|
||||||
|
|
||||||
|
print('Ожидание сообщений...')
|
||||||
|
channel.start_consuming()
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Consumer 2.
|
||||||
|
|
||||||
|
```py
|
||||||
|
import pika
|
||||||
|
|
||||||
|
|
||||||
|
def process_message(ch, method, properties, body):
|
||||||
|
print(f"Получено сообщение: {body}")
|
||||||
|
print("Сообщение успешно обработано")
|
||||||
|
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
result = channel.queue_declare(queue='', exclusive=True)
|
||||||
|
queue_name = result.method.queue
|
||||||
|
|
||||||
|
channel.queue_bind(exchange='Agreements', queue=queue_name)
|
||||||
|
|
||||||
|
channel.basic_consume(queue=queue_name, on_message_callback=process_message, auto_ack=True)
|
||||||
|
|
||||||
|
print('Ожидание сообщений...')
|
||||||
|
channel.start_consuming()
|
||||||
|
```
|
||||||
|
|
||||||
|
## Результаты выполнения лабораторной работы
|
||||||
|
|
||||||
|
Результат отработки Consumer_1:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Результат отработки Consumer_2:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Вывод: Consumer_2 нагружает меньше памяти, чем Consumer_1 и принимает сообщения гораздо быстрее, тем самым не позволяя очереди накапливать огромное количество сообщений.
|
||||||
25
tasks/melnikov-ky/lab_4/Tut1/receive.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import pika, sys, os
|
||||||
|
|
||||||
|
def main():
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
channel.queue_declare(queue='MelnikovLogs')
|
||||||
|
|
||||||
|
def callback(ch, method, properties, body):
|
||||||
|
print(f" [x] Получено сообщение: {body}")
|
||||||
|
|
||||||
|
channel.basic_consume(queue='MelnikovLogs', on_message_callback=callback, auto_ack=True)
|
||||||
|
|
||||||
|
print(' [*] Ожидание сообщений. Для завершения CTRL+C')
|
||||||
|
channel.start_consuming()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
main()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print('Произошла ошибка')
|
||||||
|
try:
|
||||||
|
sys.exit(0)
|
||||||
|
except SystemExit:
|
||||||
|
os._exit(0)
|
||||||
11
tasks/melnikov-ky/lab_4/Tut1/send.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import pika
|
||||||
|
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
channel.queue_declare(queue='melnikov')
|
||||||
|
|
||||||
|
channel.basic_publish(exchange='',routing_key='melnikov',body='Hello, my name is Kirill, i am from ISEbd-41!')
|
||||||
|
print(" [x] Отправлено сообщение")
|
||||||
|
|
||||||
|
connection.close()
|
||||||
13
tasks/melnikov-ky/lab_4/Tut2/new_task.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import pika
|
||||||
|
import sys
|
||||||
|
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
channel.queue_declare(queue='melnikov2', durable=True)
|
||||||
|
|
||||||
|
message = ' '.join(sys.argv[1:]) or "Hello, my name is Kirill, i am from ISEbd-41!"
|
||||||
|
channel.basic_publish(exchange='', routing_key='melnikov2', body=message, properties=pika.BasicProperties(
|
||||||
|
delivery_mode=pika.spec.PERSISTENT_DELIVERY_MODE))
|
||||||
|
print(f" [x] Отправлено {message}")
|
||||||
|
connection.close()
|
||||||
19
tasks/melnikov-ky/lab_4/Tut2/worker.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import pika
|
||||||
|
import time
|
||||||
|
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
channel.queue_declare(queue='melnikov2', durable=True)
|
||||||
|
print(' [*] Ожидание сообщений.')
|
||||||
|
|
||||||
|
def callback(ch, method, properties, body):
|
||||||
|
print(f" [x] Получено сообщение: {body.decode()}")
|
||||||
|
time.sleep(body.count(b'.'))
|
||||||
|
print(" [x] Выполнено")
|
||||||
|
ch.basic_ack(delivery_tag=method.delivery_tag)
|
||||||
|
|
||||||
|
channel.basic_qos(prefetch_count=1)
|
||||||
|
channel.basic_consume(queue='melnikov2', on_message_callback=callback)
|
||||||
|
|
||||||
|
channel.start_consuming()
|
||||||
12
tasks/melnikov-ky/lab_4/Tut3/emit_log.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import pika
|
||||||
|
import sys
|
||||||
|
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
channel.exchange_declare(exchange='MelnikovLogs', exchange_type='fanout')
|
||||||
|
|
||||||
|
message = ' '.join(sys.argv[1:]) or "Info: Hello, my name is Kirill, i am from ISEbd-41!"
|
||||||
|
channel.basic_publish(exchange='MelnikovLogs', routing_key='', body=message)
|
||||||
|
print(f" [x] Отправлено сообщение: {message}")
|
||||||
|
connection.close()
|
||||||
21
tasks/melnikov-ky/lab_4/Tut3/receive_logs.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import pika
|
||||||
|
|
||||||
|
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
|
||||||
|
channel = connection.channel()
|
||||||
|
|
||||||
|
channel.exchange_declare(exchange='MelnikovLogs', exchange_type='fanout')
|
||||||
|
|
||||||
|
result = channel.queue_declare(queue='', exclusive=True)
|
||||||
|
queue_name = result.method.queue
|
||||||
|
|
||||||
|
channel.queue_bind(exchange='MelnikovLogs', queue=queue_name)
|
||||||
|
|
||||||
|
print(' [*] Ожидание сообщений. Для завершения CTRL+C')
|
||||||
|
|
||||||
|
def callback(ch, method, properties, body):
|
||||||
|
print(f" [x] {body}")
|
||||||
|
|
||||||
|
channel.basic_consume(
|
||||||
|
queue=queue_name, on_message_callback=callback, auto_ack=True)
|
||||||
|
|
||||||
|
channel.start_consuming()
|
||||||
BIN
tasks/melnikov-ky/lab_4/scrins/emitlog.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
tasks/melnikov-ky/lab_4/scrins/maintask1.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
tasks/melnikov-ky/lab_4/scrins/maintask2.png
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
tasks/melnikov-ky/lab_4/scrins/maintask_dop.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
tasks/melnikov-ky/lab_4/scrins/newtask.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
tasks/melnikov-ky/lab_4/scrins/receive.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
tasks/melnikov-ky/lab_4/scrins/receivelogs.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
tasks/melnikov-ky/lab_4/scrins/send.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
tasks/melnikov-ky/lab_4/scrins/tut1.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
tasks/melnikov-ky/lab_4/scrins/tut2.png
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
tasks/melnikov-ky/lab_4/scrins/tut3.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
tasks/melnikov-ky/lab_4/scrins/worker.png
Normal file
|
After Width: | Height: | Size: 27 KiB |