Skip to content

Meteor 中的 WebSocket 压缩

¥Websocket Compression in Meteor

警告

在不了解应用的 DDP 消息传递模式的情况下修改 websocket 压缩设置可能会对性能产生负面影响。在更改这些设置之前,你应该:

¥Modifying websocket compression settings without understanding your application's DDP messaging patterns can negatively impact performance. Before changing these settings, you should:

  • 使用 Meteor DevTools Evolved 或浏览器的“网络”选项卡监控 WebSocket 流量

    ¥Use Meteor DevTools Evolved or your browser's Network tab to monitor WebSocket traffic

  • 分析你的 DDP 消息频率和负载大小

    ¥Analyze your DDP message frequency and payload sizes

  • 在临时环境中使用真实数据和用户负载测试更改

    ¥Test changes in a staging environment with realistic data and user load

Meteor 的流服务器默认使用 permessage-deflate 扩展进行 websocket 压缩。虽然压缩可以帮助减少带宽使用,但由于压缩大量 DDP 消息的计算开销,它可能会影响反应密集型应用的性能。

¥Meteor's stream server uses the permessage-deflate extension for websocket compression by default. While compression can help reduce bandwidth usage, it may impact performance in reactivity-intensive applications due to the computational overhead of compressing numerous DDP messages.

配置

¥Configuration

禁用压缩

¥Disabling Compression

你可以通过将 SERVER_WEBSOCKET_COMPRESSION 环境变量设置为 false 来禁用 websocket 压缩:

¥You can disable websocket compression by setting the SERVER_WEBSOCKET_COMPRESSION environment variable to false:

bash
SERVER_WEBSOCKET_COMPRESSION=false

自定义压缩设置

¥Custom Compression Settings

要自定义压缩设置,请将 SERVER_WEBSOCKET_COMPRESSION 设置为 JSON 字符串,并采用你所需的配置:

¥To customize compression settings, set SERVER_WEBSOCKET_COMPRESSION to a JSON string with your desired configuration:

bash
# Example with custom settings
SERVER_WEBSOCKET_COMPRESSION='{"threshold": 2048, "level": 1}'

可用的配置选项:

¥Available configuration options:

  • threshold:应用压缩前的最小消息大小(以字节为单位)(默认值:1024)

    ¥threshold: Minimum message size (in bytes) before compression is applied (default: 1024)

  • level:压缩级别(0-9,其中 0=无,1=最快,9=最佳压缩)

    ¥level: Compression level (0-9, where 0=none, 1=fastest, 9=best compression)

  • memLevel:内存级别(1-9,级别越低,占用的内存越少)

    ¥memLevel: Memory level (1-9, lower uses less memory)

  • noContextTakeover:当设置为 true 时,压缩器会为每条消息重置(默认值:true)

    ¥noContextTakeover: When true, compressor resets for each message (default: true)

  • maxWindowBits:压缩窗口大小(9-15,较小的窗口占用更少内存)

    ¥maxWindowBits: Window size for compression (9-15, lower uses less memory)

配置示例

¥Configuration Examples

以下是针对不同类型应用的推荐配置:

¥Here are recommended configurations for different types of applications:

高频更新/实时仪表盘

¥High-Frequency Updates / Real-Time Dashboard

对于频繁进行小规模更新的应用(例如,实时仪表板、交易平台):

¥For applications with frequent small updates (e.g., real-time dashboards, trading platforms):

bash
# Disable compression for optimal performance with small, frequent updates
SERVER_WEBSOCKET_COMPRESSION=false

大数据传输

¥Large Data Transfers

对于传输大型数据集的应用(例如,文件共享、数据可视化):

¥For applications transferring large datasets (e.g., file sharing, data visualization):

bash
# Optimize for large data transfers
SERVER_WEBSOCKET_COMPRESSION='{"threshold": 1024, "level": 6, "memLevel": 8}'

内存受限环境

¥Memory-Constrained Environment

对于内存资源有限的部署:

¥For deployments with limited memory resources:

bash
# Minimize memory usage while maintaining compression
SERVER_WEBSOCKET_COMPRESSION='{"threshold": 2048, "level": 1, "memLevel": 1, "maxWindowBits": 9}'

平衡配置

¥Balanced Configuration

对于包含混合消息大小的典型应用:

¥For typical applications with mixed message sizes:

bash
# Balance between compression and performance
SERVER_WEBSOCKET_COMPRESSION='{"threshold": 1536, "level": 3, "memLevel": 4}'

验证压缩状态

¥Verifying Compression Status

你可以通过 Meteor shell 检查是否启用了压缩:

¥You can check if compression is enabled through the Meteor shell:

javascript
Meteor.server.stream_server.server.options.faye_server_options.extensions

结果解读:

¥Results interpretation:

  • [](空数组):压缩已禁用

    ¥[] (empty array): Compression is disabled

  • [{}](带对象的数组):压缩已启用

    ¥[{}] (array with object): Compression is enabled

性能考虑

¥Performance Considerations

  • 对于消息吞吐量高或频繁进行小规模更新的应用,禁用压缩可能会提升性能。

    ¥For apps with high message throughput or frequent small updates, disabling compression may improve performance

  • 大型消息负载可能需要压缩,尤其是在网络连接较慢的情况下。

    ¥Large message payloads may benefit from compression, especially over slower network connections

  • 调整压缩设置时,请考虑监控 CPU 使用率和响应时间

    ¥Consider monitoring CPU usage and response times when adjusting compression settings

默认配置

¥Default Configuration

启用后,默认配置使用:

¥When enabled, the default configuration uses:

  • 压缩阈值:1024 字节

    ¥Compression threshold: 1024 bytes

  • 压缩级别:Z_BEST_SPEED(最快)

    ¥Compression level: Z_BEST_SPEED (fastest)

  • 内存级别:Z_MIN_MEMLEVEL(最小内存使用量)

    ¥Memory level: Z_MIN_MEMLEVEL (minimum memory usage)

  • 上下文接管:已禁用

    ¥Context takeover: Disabled

  • Windows 位图:Z_MIN_WINDOWBITS(最小窗口大小)

    ¥Window bits: Z_MIN_WINDOWBITS (minimum window size)