diff --git a/vendor/magento/module-theme/Controller/Result/MessagePlugin.php b/vendor/magento/module-theme/Controller/Result/MessagePlugin.php
index 10cba6e8690..1de5189d262 100644
--- a/vendor/magento/module-theme/Controller/Result/MessagePlugin.php
+++ b/vendor/magento/module-theme/Controller/Result/MessagePlugin.php
@@ -8,7 +8,7 @@ namespace Magento\Theme\Controller\Result;
 use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Controller\Result\Json;
 use Magento\Framework\Controller\ResultInterface;
-use Magento\Framework\Message\MessageInterface;
+use Magento\Framework\Stdlib\Cookie\CookieSizeLimitReachedException;
 use Magento\Framework\Translate\Inline\ParserInterface;
 use Magento\Framework\Translate\InlineInterface;

@@ -94,11 +94,44 @@ class MessagePlugin
         ResultInterface $result
     ) {
         if (!($subject instanceof Json)) {
-            $this->setCookie($this->getMessages());
+            $newMessages = [];
+            foreach ($this->messageManager->getMessages(true)->getItems() as $message) {
+                $newMessages[] = [
+                    'type' => $message->getType(),
+                    'text' => $this->interpretationStrategy->interpret($message),
+                ];
+            }
+            if (!empty($newMessages)) {
+                $this->setMessages($this->getCookiesMessages(), $newMessages);
+            }
         }
         return $result;
     }

+    /**
+     * Add new messages to already existing ones.
+     *
+     * In case if there are too many messages clear old messages.
+     *
+     * @param array $oldMessages
+     * @param array $newMessages
+     * @throws CookieSizeLimitReachedException
+     */
+    private function setMessages(array $oldMessages, array $newMessages): void
+    {
+        $messages = array_merge($oldMessages, $newMessages);
+        try {
+            $this->setCookie($messages);
+        } catch (CookieSizeLimitReachedException $e) {
+            if (empty($oldMessages)) {
+                throw $e;
+            }
+
+            array_shift($oldMessages);
+            $this->setMessages($oldMessages, $newMessages);
+        }
+    }
+
     /**
      * Set 'mage-messages' cookie with 'messages' array
      *
@@ -158,24 +191,6 @@ class MessagePlugin
         return $text;
     }

-    /**
-     * Return messages array and clean message manager messages
-     *
-     * @return array
-     */
-    protected function getMessages()
-    {
-        $messages = $this->getCookiesMessages();
-        /** @var MessageInterface $message */
-        foreach ($this->messageManager->getMessages(true)->getItems() as $message) {
-            $messages[] = [
-                'type' => $message->getType(),
-                'text' => $this->interpretationStrategy->interpret($message),
-            ];
-        }
-        return $messages;
-    }
-
     /**
      * Return messages stored in cookies
      *
