Как я могу сделать размеры упаковки Service Fabric практичными? - PullRequest
0 голосов
/ 15 февраля 2019

Я работаю над приложением Service Fabric, которое развернуто в Azure.В настоящее время он состоит только из 5 служб без гражданства.Зархивированный архив весит ~ 200 МБ, что уже становится проблематичным.

Изучив содержимое архива, я вижу, что основная проблема заключается в том, что многие файлы требуются многим файлам.Поэтому точная копия этих файлов присутствует в папке каждой службы.Однако формат сжатия zip не делает ничего умного в отношении дубликатов файлов в архиве.

В качестве эксперимента я написал небольшой сценарий, чтобы найти все дублирующиеся файлы в развертывании и удалить все, кроме одного из каждогофайлы.Затем я попытался сжать результаты и получить гораздо более практичные 38 МБ.

Я также заметил, что системные библиотеки связаны, в том числе:

  • System.Private.CoreLib.dll(12 МБ)
  • System.Private.Xml.dll (8 МБ)
  • coreclr.dll (5 МБ)

Это все большие файлы, поэтому я быинтересно узнать, был ли у меня способ собрать их только один раз.Я пытался удалить их полностью, но затем Service Fabric не запускает приложение.

Может кто-нибудь предложить какой-либо совет относительно того, как я могу резко уменьшить размер пакета развертывания?

ПРИМЕЧАНИЕ.мы уже читали документы по сжатию пакетов , но я очень озадачен, почему их метод сжатия может помочь.Действительно, я попробовал это, и это не так.Все, что они делают, - это заархивируют каждую подпапку внутри основного zip-файла, но дедупликация файлов не происходит.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Есть способ уменьшить размер пакета, но я бы сказал, что это не хороший способ или способ, которым все должно быть сделано , но все же я думаю, что он может быть полезен в некоторых случаях.

Обратите внимание: этот подход требует, чтобы на целевых машинах были установлены все необходимые компоненты (включая .NET Core Runtime и т. Д.)

При создании приложения .NET Core существует дваМодели развертывания: автономные и зависящие от фреймворка.

В автономном режиме все необходимые двоичные файлы каркаса публикуются с двоичными файлами приложения, тогда как в зависимом от каркаса публикуются только двоичные файлы приложения.

По умолчанию, если в проекте указано время выполнения: <RuntimeIdentifier>win7-x64</RuntimeIdentifier> в .csproj, тогда операция публикации является автономной, поэтому все ваши сервисы копируют все.

Для того, чтобы отключить этоВы можете просто добавить свойство SelfContained = false в каждый имеющийся у вас сервисный проект.

Вот пример нового сервиса .NET Core без сохранения состоянияпроект:

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  <IsServiceFabricServiceProject>True</IsServiceFabricServiceProject>
  <ServerGarbageCollection>True</ServerGarbageCollection>
  <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
  <TargetLatestRuntimePatch>False</TargetLatestRuntimePatch>
  <SelfContained>false</SelfContained>
</PropertyGroup>

Я провел небольшой тест и создал новое приложение Service Fabric с пятью сервисами.Размер несжатого пакета в Debug составлял около 500 МБ.После того, как я изменил все проекты, размер пакета упал до ~ 30 МБ.

Развернутое приложение хорошо работало в локальном кластере, поэтому оно демонстрирует, что эта концепция является рабочим способом уменьшения размера пакета.

В конце я еще раз выделю предупреждение:

Обратите внимание: этот подход требует, чтобы на целевых машинах были установлены все необходимые компоненты (включая .NET Core Runtime и т. Д.)

0 голосов
/ 18 февраля 2019

Обычно вы не хотите знать, какой узел запускает какую службу, и вы хотите развернуть версии службы независимо друг от друга, поэтому совместное использование двоичных файлов между независимыми службами создает очень неестественную зависимость во время выполнения.Я бы посоветовал против этого, за исключением бинарных платформ, таких как AspNet и DotNet, конечно.

Однако, вы читали о создании дифференциальных пакетов?https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-application-upgrade-advanced#upgrade-with-a-diff-package, что уменьшит размер пакетов обновления после первоначального попадания в 200 МБ.

...