我们用C#开发.NET Enterprise软件.我们正在寻求改进我们的版本控制系统.我之前使用过mercurial并且一直在我们公司进行实验.但是,由于我们开发企业产品,因此我们非常关注可重用的组件或模块.我一直在尝试使用mercurial的子repos来管理组件和依赖,但是遇到了一些困难.以下是源代码管理/依赖关系管理的基本要求:
这是我一直在使用的mercurial结构:
SHARED1_SLN-+-docs
|
+-libs----NLOG
|
+-misc----KEY
|
+-src-----SHARED1-+-proj1
| +-proj2
|
+-tools---NANT
Run Code Online (Sandbox Code Playgroud)
SHARED2_SLN-+-docs
|
+-libs--+-SHARED1-+-proj1
| | +-proj2
| |
| +-NLOG
|
+-misc----KEY
|
+-src-----SHARED2-+-proj3
| +-proj4
|
+-tools---NANT
Run Code Online (Sandbox Code Playgroud)
PROD_SLN----+-docs
|
+-libs--+-SHARED1-+-proj1
| | +-proj2
| |
| +-SHARED2-+-proj3
| | +-proj4
| |
| +-NLOG
|
+-misc----KEY
|
+-src-----prod----+-proj5
| +-proj6
|
+-tools---NANT
Run Code Online (Sandbox Code Playgroud)
mercurial shared-libraries dependency-management mercurial-subrepos
我们使用REST 服务 API从 PubSub 订阅中提取消息。准备好接受服务的消息被确认,而其他消息则在稍后的执行周期中未被确认而需要接受服务。
在执行周期中,我们使用和向服务 REST API发送单个请求。pullreturnImmediately=truemaxMessages=100
在测试时,我们遇到了这样的情况:每个执行周期仅返回 3 条“旧”消息。新发布的消息从未包含在 的请求中pull。我们通过监控 Stackdriver 监控中的未送达消息来验证新消息是否已成功到达订阅。
pull不包含所有未传递的消息?maxMessages参数吗?pull我们通过向API 发送 2 个并行请求并合并结果来解决该问题。我们找到了此处讨论的解决方法(需要并行请求)。
我在我们的博客上写了一篇文章,解释了为什么我们强制使用 PubSub 服务 REST API。
我们有一个使用 2 个 pubsub 主题/订阅对的架构:
T1由 cronjob 定期触发(例如每 5 分钟)。订阅S1是我们云功能的触发器。T2充当由我们的服务之一发布的后台作业的队列。云函数在每次执行时都会读取订阅S2,以便为排队的后台作业提供服务。这使我们能够控制后台作业的服务频率,而与它们何时添加到队列无关。
云函数(由 触发)通过PullS1读取消息。它决定哪些后台作业已准备就绪,并在成功为作业提供服务后,确认相关消息。未准备好或失败的作业不会被确认以便稍后提供服务。S2
我们在使用google 的官方Node.js pubusb 客户端时遇到问题:
ack()通过调查日志来确保我们正在调用。S2stackdriver 中未确认的消息计数或通过重新部署该函数并查看得到服务的消息来验证消息是否在订阅中排队。我们认为这是 google 的 node.js pubsub 客户端的问题。云功能文档明确指出不启动后台活动。然而,查看 Node.js pubsub 客户端源代码,它显然使用超时在后台提供确认服务。
google的node.js pubsub客户端与google云功能不兼容吗?Google建议仅在客户端库不存在或不能满足其他需求时才访问服务 API。在云功能中运行客户端是否是“其他需求”,要求我们使用服务 API 编写自己的客户端?
作为一种“解决方法”,我们尝试延迟 cloudfunction 的执行结束,以允许 node.js pubsub 客户端中的任何“后台”进程完成,但这并不能始终消除我们的问题。pubsub 客户端似乎对云函数不友好,并且无法从云函数执行之间的停止中恢复。
我在我们的博客上写了一篇文章,详细描述了我们为什么 …